搭建EFK日志分析系统

搭建EFK日志分析系统

 

背景

这篇文章偏向运维,在我们开发中,日志对于我们来说非常重要,发现问题以及排查问题的必需品。项目在部署一台或者两台的时候我们可以通过Xshell来查看日志。一旦项目部署多台机器之后,我们看日志是非常麻烦的。ELK可以帮助我们来查看日志。
elastic官网,EFK有很多产品我们需要下载 elasticsearch,filebeat,kibana,logstash。还需要下载一个jdk(最低版本为1.8),elasticsearch的运行需要jdk的支持(elasticsearch是Java语言写的)
写此文章时,elasticsearch,filebeat,kibana,logstash我均下载的最新版本6.5.4。请大家自行下载最新版本就行。我说一下我这里为什么使用EFK(elasticsearch,filebeat,kibana)。

  • filebeat是一个轻量级的日志采集框架,机器配置不高的情况下用filebeat。(logstash用Java语言编写,会占用机器内存)
  • 侵入低,无需修改程序目前任何代码和配置
  • 相对于logstash来说性能高,logstash对于IO占用很大
    总体来说filebeat也并不是完全好过logstash,毕竟logstash对于日志的格式化这些相对filebeat好很多filebeat只是将日志从日志文件中读取出来,当然如果你日志本身是有一定格式的,filebeat也可以格式化,但是相对于logstash来说,还是差一点。

环境搭建

elasticsearch,filebeat,kibana,(logstash 非必须),6.5.4版本的准备好安装包,以及jdk8的版本。我做试验用的时虚拟机(VMware Workstation Pro)
如果有不会安装的请私信我,我在单独写出一篇文章教给大家如何安装。VMware Workstation Pro虚拟机内存最好设置大点,我设置的为4个G,因为elasticsearch非常耗费内存

jdk的安装

1
[root@localhost opt]# tar -zxvf jdk-8u191-linux-x64.tar.gz

解压完毕之后可以顺手把tar.gz删除掉

1
[root@localhost opt]# rm -rf jdk-8u191-linux-x64.tar.gz

 

然后将jdk配置到/etc/profile尾部

1
[root@localhost jdk1.8.0_191]# vim /etc/profile

 

按i进入输入模式,将内容添加至/etc/profile尾部

1
2
3
4
5
6
# /opt/jdk1.8.0_191 为安装目录,选择自己的目录
export JAVA_HOME=/opt/jdk1.8.0_191
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}

 

输入完毕之后按Esc,然后输入:wq保存,通过命令source /etc/profile让profile文件立即生效

1
[root@localhost /]# source /etc/profile

 

验证安装是否成功

1
[root@localhost /]# java -version

 

搭建EFK日志分析系统

安装ElasticSearch

es很方便,解压就可以直接用了,下面我们尝试运行一下。

  1. 解压

    1
    
    [root@localhost opt]# tar -zxvf elasticsearch-6.5.4.tar.gz
    
  2. 运行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    [2019-01-11T14:44:09,003][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [unknown] uncaught exception in thread [main]
    org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
    	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:140) ~[elasticsearch-6.5.4.jar:6.5.4]
    	at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:127) ~[elasticsearch-6.5.4.jar:6.5.4]
    	at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.5.4.jar:6.5.4]
    	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.5.4.jar:6.5.4]
    	at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.5.4.jar:6.5.4]
    	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[elasticsearch-6.5.4.jar:6.5.4]
    	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:86) ~[elasticsearch-6.5.4.jar:6.5.4]
    Caused by: java.lang.RuntimeException: can not run elasticsearch as root
    	at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:103) ~[elasticsearch-6.5.4.jar:6.5.4]
    	at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:170) ~[elasticsearch-6.5.4.jar:6.5.4]
    	at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-6.5.4.jar:6.5.4]
    	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[elasticsearch-6.5.4.jar:6.5.4]
    	... 6 more
    

很不幸,启动报错了 can not run elasticsearch as root,root不允许直接启动。因为这个原因,我们需要新建一个用户来启动es,具体操作如下:

1
2
3
4
5
6
7
8
9
10
# 以root用户来创建新的用户 , groupadd 添加一个用户组
[root@localhost home]# groupadd elasticsearch 
# 添加一个用户,-g是在用户组下 -p是密码
[root@localhost home]# useradd elasticsearch -g elasticsearch -p elasticsearch
# 进入es的安装目录
[root@localhost home]# cd /opt
# 给用户elasticsearch 授权
[root@localhost home]# chown -R elasticsearch:elasticsearch elasticsearch-6.5.4/
# 切换到 elasticsearch 用户
[root@localhost elasticsearch]# su elasticsearch

 

然后进入bin目录下面重新启动

1
[elasticsearch@localhost bin]$ ./elasticsearch

 

如果想让ES在后台运行可以加入 -d 参数

1
[elasticsearch@localhost bin]$ ./elasticsearch -d

 

验证是否能访问

1
[root@localhost ~]# curl -get localhost:9200

 

可是我这里通过IP就是访问不了,有以下原因

  1. 防火墙问题请参考此链接
  2. 切换成root用户编辑 /etc/sysctl.conf,在尾部新增 vm.max_map_count=655360,保存之后执行此命令sysctl -p。编辑 /etc/security/limits.conf 文件,在尾部添加

    1
    2
    
    elasticsearch soft nofile 65536
    elasticsearch hard nofile 131072
    

    其中 elasticsearch 为ES启动用户。最后一步 编辑ES下的 config/elasticsearch.yml。将network.host改为 network.host: 0.0.0.0再次启动./elasticsearch即可通过IP访问
    搭建EFK日志分析系统
    es启动监听两个端口,9300和9200
    9300端口是使用tcp客户端连接使用的端口。
    9200端口是通过http协议连接es使用的端口。

安装head插件

安装head插件方便我们以图形化的界面来查看ES的状态,下面我说一下head插件如何安装。

  • 因为head插件需要安装node.js的支持,所以需要到官网下载一下node.js官网下载地址
    解压[root@localhost opt]# tar -zxvf node-v4.4.7-linux-x64.tar.gz,配置环境变量如下:
    搭建EFK日志分析系统
    source /etc/profile测试一下是否生效,node -vnpm -v
  • 下载elastichsearch-head下载地址,下载zip格式的,解压[root@localhost opt]# unzip elasticsearch-head-master.zip
    进入到进入到elasticsearch-head-master,执行npm install -g grunt-clinpm install 。
    进入到elasticsearch主目录下的/config/elasticsearch.yml,加入以下内容:
    1
    2
    
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    

打开elasticsearch-head-master/Gruntfile.js,找到下面connect属性,新增hostname:’*’:
搭建EFK日志分析系统
期间可能会遇到防火墙的问题,请参考上面防火墙问题的链接
启动elasticsearch-head,进入elasticsearch-head目录,执行命令:grunt server,后台启动elasticsearch-head,执行命令 nohup grunt server
通过 IP地址:9100 就可以查看ElasticSearch的信息了。关闭head插件使用ps -aux|grep head,杀死进程,kill -9 进程号

安装Kibana

1
[root@localhost opt]# tar -zxvf kibana-6.5.4-linux-x86_64.tar.gz

进入主目录,修改配置

1
[root@localhost opt]# vi config/kibana.yml

 

取消注释并修改一下配置

1
2
3
4
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://IP地址:9200"
ibana.index: ".kibana"

 

其中server.port为端口号默认为5601,server.host默认是localhost,如果只是本地访问可以默认localhost,如果需要外网访问,可以设置为0.0.0.0。elasticsearch.url为Elasticsearch的地址。
启动kibana,进入bin目录下。

1
./kibana

 

试验一下是否可以访问,输入Ip地址:端口,如果无法访问的话,请开启5601端口。操作防火墙的详细方法请参考此链接

安装FileBeat

详细配置请参考官网参考链接

1
[root@localhost opt]# tar -zxvf filebeat-6.5.4-linux-x86_64.tar.gz

 

配置如下图:
搭建EFK日志分析系统
搭建EFK日志分析系统
搭建EFK日志分析系统

1
2
 paths:
- /var/log/*.log

 

这是默认的,可以修改,
设置Kibana仪表板命令./filebeat setup --dashboards,启动 FileBeat进入主目录后执行./filebeat -e。然后再/var/log/目录下创建一个文本。
再Kibana中选择
搭建EFK日志分析系统
搭建EFK日志分析系统
我们可以看到最后一张图片,message部分就是日志的内容。

# ELK日志

上一篇:Linux高性能服务器编程——进程池和线程池


下一篇:python笔记:如何用pygame在python中导入图片