ELK7.x日志系统搭建 2. Nginx、Cluster等日志收集
接着上篇文章,我们把环境搭建好后,我们需要对一些应用程序进行日志收集了,方便我们对整个项目的监控和管理。虽然这种东西在单节点项目上带来的好处比带来的成本要低的低,但是对于我们开发一些分布式的项目是有极大的便利的。
我们想象一个场景:为了高性能我们引入了负载均衡 + N个服务器副本,如果程序出现错误,我们首先得先定位到是哪台服务器,然后定位到哪个程序,最后查看对应日志,开始排错。这样中心化系统的好处就体现出来了。
我们接下来用前面的两个节点分别部署了 nginx
,然后使用 logstash
收集信息到 es
Logstash说明
logstash
分为三个处理阶段,input
、filter
、output
特点:
- 输入和输出可以是标准输入输出
- 可以建立TCP或者UDP连接进行监听获取信息
- 可以从
redis
、kafka
获取信息
在我们进行日志收集的时候,面对各种应用程序日志输出都需要输送到 ES
里面,但是日志文件的格式化输出方式却是各有千秋。那么这个时候我们收集日志只有两种处理方式:
- 不修改源日志格式 简单的说就是在logstash中转通过 grok方式进行过滤处理,将原始无规则的日志转换为规则日志(Logstash自定义日志格式)
这样 Logstash
会通过 grok
来处理分析,对线上业务无任何影响;但是在高压环境下,Logstash
中的 grok
会成为性能瓶颈,最终会阻塞正常的日志输出,所以,在 Logsatsh
中,尽量不要使用 grok
过滤功能,这样就等于可以跳过 filter
阶段
- 修改源日志格式 将需要的日志格式进行规则输出,logstash只负责日志的收集和传输,不对日志做任何过滤处理(生产者自定义日志格式)
这个就是在收集生产日志的过程中,自定义(format)
日志格式,虽然有一定的工作量,但是优势很明显,因为是实现定义好了日志输出格式, logstash
那就只负责收集和传输了,这样大大减轻了 logstash
负担,可以更高效的收集和传输日志;是企业首选方案
我们的例子都以配置好的日志格式进行传输,有兴趣了解 grok
的去官网看看
收集多节点nginx日志
- 配置nginx日志输出
## # Log Format ## log_format json '{"@timestamp":"$time_iso8601",' '"@version":"1",' '"client":"$remote_addr",' '"url":"$uri",' '"status":"$status",' '"domain":"$host",' '"host":"$server_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"referer": "$http_referer",' '"ua": "$http_user_agent"' '}'; ## # Logging Settings ## access_log /var/log/nginx/access.log json; error_log /var/log/nginx/error.log error;
- 配置 logstash
vi ./conf.d/nginx-access.conf
input{ file { path => "/var/log/nginx/access.log" type => "nginx-access-log" start_position => "beginning" stat_interval => "2" codec => "json" # 通用选项,用于输入数据的编解码器。 可以直接使用json做解码 } } output{ elasticsearch{ hosts => ["192.168.179.124:9200"] #elasticsearch服务器地址 user => "elastic" password => "${ES_PWD}" index =>"nginx-access-log-%{+YYYY.MM.dd}.log" } }
- 测试配置文件
./bin/logstash -f conf.d/ -t
Sending Logstash logs to /home/test/logstash-7.6.0/logs which is now configured via log4j2.properties [2020-06-26T09:19:40,683][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified [2020-06-26T09:19:43,158][INFO ][org.reflections.Reflections] Reflections took 55 ms to scan 1 urls, producing 20 keys and 40 values Configuration OK [2020-06-26T09:19:49,466][INFO ][logstash.runner ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
成功,可以启动了
收集es集群日志
我们把日志配置到了 /elk/logs
下面,可以看到, es
日志直接就是 json
版本的,就不需要我们进行 filter
了
- 配置 logstash
input{ file { path => "/elk/logs/elk-application_server.json" type => "elk-log" start_position => "beginning" stat_interval => "2" codec => "json" } } output{ elasticsearch{ hosts => ["192.168.179.124:9200"] #elasticsearch服务器地址 user => "elastic" password => "${ES_PWD}" index =>"elk-log-%{+YYYY.MM.dd}.log" } }
两个节点,每个都安装了 nginx
,都编写了配置文件,我们需要在 kibana
上创建索引模式
等等等,最后我们看一下效果
本来是准备全套收集一下日志,但是机器不允许, 本身 es
这套就比较费内存,加上机器上还有一些其他的,差点机器连 logstash
都跑不起来,所以更多姿势需要大家查阅一下官网或者其他文档资料哦。