ELK日志分析系统搭建
之前一段时间由于版本迭代任务紧,组内代码质量不尽如人意。接二连三的被测试提醒后台错误之后, 我们决定搭建一个后台日志分析系统, 经过几个方案比较后,选择的相对更简单的ELK方案。
ELK 是Elasticsearch, Logstash,Kibana三个组件的首字母组合,这种方案最初的做法是:使用Logstash 去服务上采集日志文件, 然后做一些过滤处理后发送给 Elasticsearch, 在Elasticsearch中创建相应的索引,由Kibana提供统计分析的页面访问。但是Logstash 本身资源消耗较大,如果把它放到业务系统的服务器上会对系统造成不小的影响,一般的做法采用beats来替代(beats是一个更轻量级的收集器),参考如下图-1,此外也会有在数据量比较大时引入消息队列来环节组件压力。
详细的关于各组件的介绍建议参考Elastic 提供的官方文档
(图-1)
(图-2)
本文将基于上图-2的架构来介绍ELK日志系统的搭建。由于环境限制,这里各组件均部署在同一服务器上。
1)搭建elasticsearch
elasticsearch的下载安装配置在所有组件中相对是最复杂的,但是它依然可以很简单的按照如下几个步骤顺利完成:
① 官网下载地址 :https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.12.1-linux-x86_64.tar.gz
② 解压之后配置 elasticsearch-7.12.1/config/elasticsearch.yml 文件,如下
③ 启动elasticsearch (处于安全考虑 elasticsearch 只能非root用户启动,需要将elasticsearch解压文件切换所属用户)
④ 验证elasticsearch是否启动成功
如果看到如下结果,代表启动成功
2)Kibana的安装
① 官网下载:https://artifacts.elastic.co/downloads/kibana/kibana-7.12.1-linux-x86_64.tar.gz
② 配置解压路径下的/kibana-7.12.1-linux-x86_64/config/kibana.yml文件:
③ 浏览器访问 http://ip:5601 (默认5601端口,可以在kibana.yml中配置) 得到如下页面表示启动成功
(图-3)
3)Filebeat 的安装
① 官方下载:https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.12.1-linux-x86_64.tar.gz
② 配置解压路径下的配置文件 filebeat.yml 如下:
filebeat.inputs:
- type: log
enabled: true
paths:
- /www/wwwlogs/wonima.log
filebeat.config.modules:
filebeat.config.modules:
filebeat.config.modules:
# Glob pattern for configuration loading
path: ${path.config}/modules.d/*.yml
# Set to true to enable config reloading
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
#index.codec: best_compression
#_source.enabled: false
setup.kibana:
output.logstash:
# The Logstash hosts
hosts: ["你logstash的ip:5044"]
# ================================= Processors =================================
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
③ 启动 filebeat
4)Logstash 的安装
① 官网下载:https://artifacts.elastic.co/downloads/logstash/logstash-7.12.1.tar.gz
② 配置logstash,增加customer-service-logstash.yml 的配置文件,文件配置内容如下:
input {
beats {
port => 5044
filter {
grok {
match => { "message" => "%{NGINXACCESS}" }
}
mutate {
remove_field =>["message"]
}
geoip {
##########备注这个库是自动加载的,但有时候如果报错可以加入试下database =>"/usr/local/logstash/config/GeoLite2-City.mmdb"
source => "clientip"
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
hosts => "127.0.0.1:9200"
index => "logstash-nginx-access-427-1"
}
}
如图所示是patterns 正则分割你日志的
nginx里面写的匹配内容就是如下:
NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} %{NGUSER:ident} %{NGUSER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent}
③ 启动logstash
所有上述组件配置启动成功后,我们可以到kibana界面, 在侧边栏 management 下按下图-4方式创建 索引模式后,然后在图-5中可以获取到实时的日志记录。
(图-4)
(图-5)
我们在logstash中增加对error级别日志的过滤处理,将这些日志统一放到 logstash-customer-service-error 索引中,然后在 kibana 中创建该索引同名的pattern, 这样在discover页签下可以直观的通过 时间段的筛选来定位error日志,并在下面的 expanded document 下查看日志的具体内容,这样一来就不需要挨个连接到服务器去手动查看日志了。
要想用geoip必须索引创建名为logstash开头(这个是个大坑啊)
胆大!心细!