elk+redis 搭建nginx日志分析平台
logstash,elasticsearch,kibana 怎样进行nginx的日志分析呢?首先,架构方面,nginx是有日志文件的,它的每个请求的状态等都有日志文件进行记录。其次,需要有个队列,redis的list结构正好能作为队列用。而后分析用elasticsearch即可以进行分析和查询了。
我们需要的是一个分布式的,日志收集和分析系统。logstash有agent和indexer两个角色。对于agent角色,放在单独的web机器上面,而后这个agent不断地读取nginx的日志文件,每当它读到新的日志信息以后,就将日志传送到网络上的一台redis队列上。对于队列上的这些未解决的日志,有不同的几台logstash indexer进行接收和分析。分析之后存储到elasticsearch进行搜索分析。再由统一的kibana进行日志web界面的展现。
下面我计划在一台机器上实现这些角色。
准备工作- 安装了redis,开启在6379端口
- 安装了elasticsearch, 开启在9200端口
- 安装了kibana, 开启了监控web
- logstash安装在/usr/local/logstash
- nginx开启了日志,目录为:/usr/share/nginx/logs/test.access.log
设置nginx日志格式在nginx.conf 中设置日志格式:logstash
log_format logstash '$http_host $server_addr $remote_addr [$time_local] "$request" ' '$request_body $status $body_bytes_sent "$http_referer" "$http_user_agent" ' '$request_time $upstream_response_time';
在vhost/test.conf中设置access日志:
access_log /usr/share/nginx/logs/test.access.log logstash;开启logstash agent
注:这里也能不使用logstash,直接用rsyslog
创立logstash agent 配置文件
vim /usr/local/logstash/etc/logstash_agent.conf
代码如下:
input { file { type => "nginx_access" path => ["/usr/share/nginx/logs/test.access.log"] }}output { redis { host => "localhost" data_type => "list" key => "logstash:redis" }}
启动logstash agent
/usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash_agent.conf
这个时候,它就会把test.access.log中的数据传送到redis中,相当于tail -f。
开启logstash indexer创立 logstash indexer 配置文件
vim /usr/local/logstash/etc/logstash_indexer.conf
代码如下:
input { redis { host => "localhost" data_type => "list" key => "logstash:redis" type => "redis-input" }}filter { grok { match => [ "message", "%{WORD:http_host} %{URIHOST:api_domain} %{IP:inner_ip} %{IP:lvs_ip} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_verb} %{URIPATH:baseurl}(?:\?%{NOTSPACE:request}|) HTTP/%{NUMBER:http_version}\" (?:-|%{NOTSPACE:request}) %{NUMBER:http_status_code} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{NUMBER:time_duration:float} (?:%{NUMBER:time_backend_response:float}|-)" ] } kv { prefix => "request." field_split => "&" source => "request" } urldecode { all_fields => true } date { type => "log-date" match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"] }}output { elasticsearch { embedded => false protocol => "http" host => "localhost" port => "9200" index => "access-%{+YYYY.MM.dd}" }}
这份配置是将nginx_access结构化以后塞入elasticsearch中。
对这个配置进行下说明:
- grok中的match正好匹配和不管是GET,还是POST的请求。
- kv是将request中的A=B&C=D的key,value扩开展来,并且利使用es的无schema的特性,保证了假如你添加了一个参数,能立即生效
- urldecode是为了保证参数中有中文的话进行urldecode
- date是为了让es中保存的文档的时间为日志的时间,否则是插入es的时间
好了,现在的结构就完成了,你能访问一次test.dev之后就在kibana的控制台看到这个访问的日志了。而且还是结构化好的了,非常方便查找。
用kibana进行查看依次开启es,logstash,kibana之后,能用es的head插件确认下es中有access-xx.xx.xx索引的数据,而后打开kibana的页面,第一次进入的时候会让你选择mapping,索引名字填写access-*,则kibana自动会创立mapping
那如何学习才可以快速入门并精通呢?
当真正开始学习的时候难免不知道从哪入手,导致效率低下影响继续学习的信心。
但最重要的是不知道哪些技术需要重点掌握,学习时频繁踩坑,最终白费大量时间,所以有一套实使用的视频课程使用来跟着学习是非常有必要的。
为了让学习变得轻松、高效,今天给大家免费分享一套阿里架构师传授的一套教学资源。帮助大家在成为架构师的道路上披荆斩棘。
这套视频课程详细讲解了(Spring,MyBatis,Netty源码分析,高并发、高性可以、分布式、微服务架构的原理,JVM性可以优化、分布式架构)等这些成为架构师必备的内容!
而且还把框架需要使用到的各种程序进行了打包,根据基础视频能让你轻松搭建分布式框架环境,像在企业生产环境一样进行学习和实践。
后端私信回复 “ 架构 ” 即可以马上免费取得这套价值一万八的内部教材!