搭建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 |
安装ElasticSearch
es很方便,解压就可以直接用了,下面我们尝试运行一下。
-
解压
1
[root@localhost opt]# tar -zxvf elasticsearch-6.5.4.tar.gz
-
运行
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就是访问不了,有以下原因
- 防火墙问题请参考此链接
-
切换成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访问
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
,配置环境变量如下:source /etc/profile
测试一下是否生效,node -v
,npm -v
- 下载elastichsearch-head下载地址,下载zip格式的,解压
[root@localhost opt]# unzip elasticsearch-head-master.zip
。
进入到进入到elasticsearch-head-master,执行npm install -g grunt-cli
,npm install
。
进入到elasticsearch主目录下的/config/elasticsearch.yml,加入以下内容:1 2
http.cors.enabled: true http.cors.allow-origin: "*"
打开elasticsearch-head-master/Gruntfile.js,找到下面connect属性,新增hostname:’*’:
期间可能会遇到防火墙的问题,请参考上面防火墙问题的链接
启动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 |
1 2 |
paths: - /var/log/*.log |
这是默认的,可以修改,
设置Kibana仪表板命令./filebeat setup --dashboards
,启动 FileBeat进入主目录后执行./filebeat -e
。然后再/var/log/目录下创建一个文本。
再Kibana中选择
我们可以看到最后一张图片,message部分就是日志的内容。