简单介绍:
ELK是三个开源工具组成,简单解释如下:
Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash是一个完全开源的工具,它可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。
Kibana 也是一个开源和免费的工具,它可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
场景分析:
日志主要包括系统日志、应用程序日志和安全日志等等。运维人员和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
这里采用开源实时日志分析ELK平台能够完美的解决我们上述的问题,当然也还有别的平台或者工具可以使用,这里只讨论ELK,官方网站:https://www.elastic.co
截止目前elk官网提供最新稳定版本为5.4.0
需要实现效果:
1、系统messages日志通过本地beat方式(数据不做任何处理)导入到elasticsearch中,最后通过kibana可以查询。
2、Apache访问日志通过远程beat方式(数据经过处理)导入到elasticsearch中,通过kibana可以搜索日志中任何一个字段展示,也可以组合模糊查询索。 也就是说将apache日志按json格式存储到elasticsearch中。
主要注意事项:
3、关闭防火墙和selinux。
4、elk为了统一都使用tar包安装所有软件。用yum安装特别是logstash会遇到很多坑。
5、搭建过程不难,难的是各个项目互相调试,难的是elk的高级使用方法。
说明:
本文目的只带你入门,至于elk更高级的应用和使用方法请查看官网或者其它技术文档。这里把所有的应用都单独分开部署是为了以后部署到docker容器中。当然你也可以都部署在一台服务器上。
详细信息:
IP地址 |
主机名 |
用途 |
安装软件 |
192.168.2.25 |
apache |
客户端 |
httpd、filebeat |
192.168.2.26 |
nginx |
客户端 |
nginx、filebeat |
192.168.2.27 |
logstash |
日志分析处理 |
logstash、filebeat |
192.168.2.28 |
elasticsearch |
存储数据 |
elasticsearch |
192.168.2.30 |
kibana |
查询数据 |
kibana |
安装步骤:
1、Elk三个节点安装jdk,jdk可以去oracle官方网站下载,版本号可以和我的不一样
点击(此处)折叠或打开
- rpm -ivh jdk-8u102-linux-x64.rpm
2、 安装 elasticsearch 节点
点击(此处)折叠或打开
- wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.0.tar.gz
- tar zxvf elasticsearch-5.4.0.tar.gz
- mv elasticsearch-5.4.0 /usr/local/elasticsearch
- cd /usr/local/elasticsearch/config
- 备份elasticsearch默认配置文件,以防修改出错
- cp elasticsearch.yml elasticsearch.yml.default
编辑后如下:
添加elasticsearch用户,tar包启动必须使用普通用户运行
点击(此处)折叠或打开
- useradd elasticsearch
- chown -R elasticsearch:elasticsearch /usr/local/elasticsearch
打开sysctl.conf文件,添加如下内容:
点击(此处)折叠或打开
- vm.max_map_count = 655360
- sysctl -p /etc/sysctl.conf
打开/etc/security/limits.conf文件,修改打开文件句柄数
点击(此处)折叠或打开
- * soft nofile 65536
- * hard nofile 65536
- * soft nproc 65536
- * hard nproc 65536
- su - elasticsearch
- cd /usr/local/elasticsearch
- bin/elasticsearch
第一次启动需要一些时间,因为需要做一些初始化动作,如果没启动成功请查系elasticsearch的相关日志解决。注意上面只是前台启动调试,在后台需要加&,需要重新启动。
查看端口是否开启
curl简单的测试
3、 安装 logstash 节点
点击(此处)折叠或打开
- wget https://artifacts.elastic.co/downloads/logstash/logstash-5.4.0.tar.gz
- tar zxvf logstash-5.4.0.tar.gz
- mv logstash-5.4.0 /usr/local/logstash
在logstash上面下载filebeat并启动,通过它来监听数据源文件的新增内容经过logstash处理后上传到es里面。
点击(此处)折叠或打开
- wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.0-linux-x86_64.tar.gz
- tar zxvf filebeat-5.4.0-linux-x86_64.tar.gz
- mv filebeat-5.4.0-linux-x86_64 /usr/local/filebeat
- cd /usr/local/filebeat
- cp filebeat.yml filebeat.yml.default
编辑filebeat.yml文件,内容如下:
启动filebeat服务
点击(此处)折叠或打开
- cd /usr/local/filebeat
- ./filebeat &
注意filebeat没有监听端口,主要看日志和进程
新建一个本地文件messages-log,可以取几条本机系统的messages文件,内容如下:
注意filebeat监听的文件记录信息在/usr/local/filebeat/data/registry
最后新建一个logstash的启动指定test.conf配置文件,内容如下:
Logstash默认有input、filter、output三个区域,一般最少需要配置input和output即可!
logstash的本身默认的logstash.yml配置文件选择不修改即可!
cd /usr/local/logstash
首先简单的测试一下logstash不指定配置文件启动
点击(此处)折叠或打开
- bin/logstash -e 'input { stdin { } } output { stdout {} }'
我们手动输入hello world它也会输出hello world
然后指定配置文件test.conf启动,注意这是在前台启动,方便调试
查看5044端口和9600端口是否开启
等待一会后应该会出现如下信息输出,这也就是test.conf里面最后一行定义输出到屏幕上。
但是配置文件中也输入到elasticsearch当中,我们验证一下:
注意下图只截了一条数据,如果想看完整的数据,我们用kibana查看。
4、安装kibana节点
点击(此处)折叠或打开
- wget https://artifacts.elastic.co/downloads/kibana/kibana-5.4.0-linux-x86_64.tar.gz
- tar zxvf kibana-5.4.0-linux-x86_64.tar.gz
- mv kibana-5.4.0-linux-x86_64 /usr/local/kibana
- cd /usr/local/kibana/config
- cp kibana.yml kibana.yml.default
编辑kibana.yml配置文件
启动kibana服务
点击(此处)折叠或打开
- bin/kibana
查看端口是否开启
打开浏览器输入http://192.168.2.30:5601
点击create按钮后,然后点击上面的discover按钮,注意如果没数据的话,注意看看导入的时间@timestamp和现在的时间对比一下,kibana默认只显示最近15分钟的数据,如果超出15分钟请选择适当的时间,从kibana可以看到messages-log里面的4条数据都正常导入了。这就也完成我们的实现的第一个效果。但是这仅仅是把流程跑通了,接下来我们需要做的事情还有更多。注意只能先导入数据到es后才能在kibana创建索引。
现在需要实现第二个效果,我们首先清除elasticsearch中的数据,其实删不删除无所谓,这里只是为了演示一下es中数据存储的位置。
rm -rf /usr/local/elasticsearch/data/nodes
关闭elasticsearch服务然后重新启动,刚刚删除的nodes目录又会重新被初始化创建,再次刷新kibana页面的discover按钮,把时间轴修改成最近5年的数据,确实报找不到数据了。
5、安装apache节点,为了简单测试我就直接yum安装
点击(此处)折叠或打开
- yum install httpd -y
- systemctl start httpd
用浏览器访问http://192.168.2.25出现apache主界面,查看日志显示如下,为了方便演示我这里只取6条数据,4条状态码为“200”,一条“403”,一条“404”,现在我们需要将这几条数据也通过logstash导入到elasticsearch中,然后通过kibana查询。
apache节点作为客户端安装filebeat
安装步骤参考上面
配置文件如下所示:
启动filebeat服务
点击(此处)折叠或打开
- ./filebeat &
停止logstash服务,然后重新指定一个test02.conf配置文件,多了一个filter区域,这里就是按照grok正则匹配apache日志,将日志中的每一个字段按json格式导入,内容如下:
上图中的的%{COMBINEDAPACHELOG}正则是默认logstash自带的,具体位置参考如下:
/usr/local/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.2/patterns/grok-patterns
上图中grok-patterns文件里面有两处COMMONAPACHELOG参数,上面一个是COMMONAPACHELOG参数,是apache作为nginx后端服务器使用的日志格式,而下面一个COMBINEDAPACHELOG参数是直接调用上面COMMONAPACHELOG的参数再加两个参数作为web服务器使用的日志格式,这里我将apache作为web服务器使用,所以用COMBINEDAPACHELOG参数即可!如果是作为nginx后端的web服务器使用就用COMMONAPACHELOG参数即可!每个参数里面格式都是以冒号分割,前面是grok-pattrens中定义的变量,后面可以自定义变量的名称,每个%代表一个匹配的参数
启动logstash前检查配置文件test02.conf是否有语法错误
正式启动logstash,这里因为数据比较多,就只截取一条数据的图
从上图中我们可以看到已经将apache日志的每个字段按json格式导入到elasticsearch中,另外还多了一些字段,比如最让人弄混淆的是timestamp和@timestamp这两个,前者就是apache的访问时间,后者你可以理解为logstash处理的时间,比我们北京时间晚8小时,我觉得这个时间基本很少使用,我们再从kibana里查询数据条数的准确性,6hits表示有6条数据,跟我们上面access_log里面的数量正好对上。
点击任意一条数据的箭头,然后点击json,我们看到apache日志的所有字段都已经按照json格式存储,比如请求、状态码、请求大小等等。
试一试模糊搜索,搜索某一访问时间内状态码为404
搜索状态码大于400小于499
从上图我们基本知道当搜索条件变得越来越严谨的时候,我们唯一的方法就是将我们的数据按字段拆分存储到elasticsearch里面。这样搜索后就是我们需要的内容。这基本完成了我们要实现的第二个效果。
接着往下走,我们需要将apache、nginx、系统日志根据不同的日志格式存储到elasticsearch里面,首先每台机器都需要收集系统日志、然后根据不同的业务收集不同业务的服务器日志。这里apache收集apache和系统日志、nginx也收集nginx和系统日志。
6、安装nginx节点,nginx作为前端反向代理服务器使用
点击(此处)折叠或打开
- . yum install epel-release -y
- . yum install nginx -y
一般我们会在日志后面增加三个转发参数,后端服务器返回的地址、后端程序返回状态码、后端程序响应时间
注意nginx日志格式在logstash的grok里面默认是没有的,但是和apache一样基本都是作为web服务器使用,很多字段参数都可以共用,这里直接在grok-patterns文件增加一个COMMONNGINX参数
COMMONNGINXLOG %{COMBINEDAPACHELOG} %{QS:x_forwarded_for} (?:%{HOSTPORT1:upstream_addr}|-) (%{STATUS:upstream_status}|-) (%{BASE16FLOAT:upstream_response_time}|-)
前面到$http_x_forwarded_for参数可以直接调用apache的,后面四个自己定义,注意冒号前面的变量一定要定义,比如HOSTPORT1和STATUS就是logstash默认没有的变量名,所以我们需要用正则匹配,在grok-patterns文件的上面加上如下内容:
保存退出,然后直接调用COMMONNGINXLOG参数即可!
现在到了定义系统日志了,虽然默认里面有但是不能很好的满足我们的需求,我们手动编写一个正则添加到grok-patterns文件里面
SYSLOG %{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}
当然也可借助于Grok Debugger或者Grok Comstructor工具来测试。添加自定义正则的时候,在Grok Debugger中可以勾选“Add custom patterns”。
现在需要调试一下nginx转发请求到apache服务器处理。也就是nginx是前端反向代理,apache是后端服务器。
编辑nginx主配置文件nginx.conf,将location /修改为如下所示:
启动nginx服务
点击(此处)折叠或打开
- systemctl start nginx
nginx上安装filebeat(步骤参考上面即可)
nginx的filebeat配置文件如下:
nginx的新建messages_log文件内容如下:
修改apache主配置文件httpd.conf文件,将日志的格式修改一下,因为现在是作为后端web服务器使用,不需要记录agent等信息。
将这行注释去掉
CustomLog "logs/access_log" common
将这行前加上注释
CustomLog "logs/access_log" combined
在apache服务器默认根目录下面/var/www/html目录下创建一个test.html文件,内容随便写点什么都行:
重启apache服务
Systemctl restart httpd
访问nginx服务
nginx日志出现如下界面说明正常
点击(此处)折叠或打开
- 192.168.9.106 - - [10/May/2017:09:14:28 +0800] "GET /test.html HTTP/1.1" 200 14 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36" "-" 192.168.2.25:80 200 0.002
- 192.168.9.106 - - [10/May/2017:09:14:28 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://192.168.2.26/test.html" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36" "-" 192.168.2.25:80 404 0.001
apache日志出现如下界面说明正常
点击(此处)折叠或打开
- 192.168.2.26 - - [10/May/2017:09:14:31 +0800] "GET /test.html HTTP/1.0" 200 14
- 192.168.2.26 - - [10/May/2017:09:14:31 +0800] "GET /favicon.ico HTTP/1.0" 404 209
apache的filebeat配置文件如下:
apache的新建messages_log文件内容如下:
这里所有的配置和测试文件都准备齐了,nginx和apache服务器日志各2条数据,系统日志各2条,也就是8条数据。
最后就是我们的重头戏了,logstash的test03.conf配置文件如下:
注意这次apache的正则匹配被我修改了,因为是作为后端服务器使用,为了验证数据导入的正确性,清除elastucsearch中的数据和nginx、apache客户端上filebeat导入的记录点信息,注意清除记录点信息要先停止filebeat服务,然后再删除registry文件再启动filebeat服务。elasticsearch清除数据参考上面步骤。
启动logstash,只截图一个系统的访问日志导入,可以看到系统日志也按日志格式字段导入到elasticsearch中存储了。
从kibana可以看到数据正好是8条
我们随便看一条系统日志导入后的json格式,主要按照SYSLOG正则分成了4个字段显示,syslog_timestamp、syslog_hostname、syslog_program、syslog_message
我们再看一下nginx日志导入后的json格式,这里nginx的字段就不一一解释了。
常见问题汇总:
1、监听文件新增内容重复导入
一般是直接编辑文件新增内容导致,正确的做法是echo “xxx” >> filename
2、Kibana里面查询没数据但是elasticsearch里面有
可能是查询数据的时间没选正确
3、Logstash启动巨慢
安装epel源然后安装haveged并启动,重启logstash
4、Yum安装的logstash能启动,但是无法导入数据到elasticsearch里面
一般情况下yum安装的elasticsearch和kibana没什么大问题,但是logstash不行,好像不太好指定配置文件,会遇到很多坑
5、数据导入后没有按照规定的正则以json方式展现
一般是数据的格式和正则对不上