1、ELK监控概述
ELK日志分析系统在运维使用过程中,很多情况都是通过filebeat接入,把日志数据放到Elasticsearc中,这样子原始化的项目日志,对于绝大部分开发来说,还是很好用的。但是仅仅如此的话,ELK存在的必须性就不是很大了,为了更好地使用ELK这个庞大的日志分析系统,可以通过logstash对于日志数据进行数据清洗,通过logstash中的zabbix插件将日志中的错误信息通过zabbix实现告警功能。
如上图中,用户可以通过kibana查看日志相关信息,logstash通过zabbix插件可以接到zabbix服务实现错误日志告警。其他相关功能不再这里做其他介绍。
2、Logstash规则
2.1、nginx日志格式
{
....
http {
....
log_format access escape=json '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$request_body" "$http_referer" '
'$request_time $host "$http_lnhost" "$http_user_agent" $http_x_forwarded_for';
access_log /var/log/nginx/access.log access;
}
....
}
2.2、logstash安装zabbix
2.3、logstash配置
# vim nginx-log.conf
input {
kafka {
bootstrap_servers => "172.16.0.6:9092" #kafka连接,根据实际 情况填写
topics => ["nginxlog"] #kafaka的topics
codec => "json"
}
}
filter {
if [fields][log_topic] == "nginxlog" {
grok {
match => {
"message" => '%{IP:remote_addr}\ -\ \[%{HTTPDATE:log_timestamp}\]\ \"%{DATA:method} %{DATA:request} %{DATA:httpversion}\" %{NUMBER:status:int}\ %{NUMBER:body_bytes_sent:float}\ %{QUOTEDSTRING:request_body}\ %{QUOTEDSTRING:http_referer}\ %{NUMBER:request_time:float}\ %{URIHOST:hostname}\ %{QUOTEDSTRING:http_lnhost}\ %{GREEDYDATA:http_user_agent}\ '
}
remove_field => ["message","timestamp"]
}
mutate {
split => ["request", "?"]
add_field => {
"request_uri" => "%{[request][0]}"
}
add_field => {
"request_params" => "%{[request][1]}"
}
remove_field => [ "request" ]
}
mutate {
add_field => [ "[zabbix_key]", "nginxlogs" ] #zabbix的key
add_field => [ "[zabbix_host]", "127.0.0.1" ] #zabbix相应的agent
add_field => [ "msg","访问IP:%{remote_addr} WEB状态码:%{status} 请求页面:https://%{hostname}%{request_uri} 请求参数:%{request_params} 请求耗时:%{request_time}" ]
}
date {
match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"]
}
}
}
output {
if [fields][log_topic] == "nginxlog" {
elasticsearch {
hosts => ["http://172.16.32.16:9200"] #根据实际情况填写
index => "nginx-access-log-%{+YYYY-MM-dd}"
user => "elastic"
password => "*************"
}
}
if [status] == 403 {
zabbix {
zabbix_host => "[zabbix_host]"
zabbix_key => "[zabbix_key]"
zabbix_server_host => "172.16.32.6" #zabbix-server地址
zabbix_server_port => "10051" #zabbix-server端口
zabbix_value => "msg"
}
}
}
filter:
1、[fields][log_topic] 字段内容根据filebeat中的值填写
2、grok下message根据相应的日志规律进行拆分,由于es自带字段表中含有message,因此需要用到移除remove_field
3、mutate使用split功能对于相应的字段进行二次拆分,需要新增字段用到add_field
检测logstash文件是否有配置错误:
启动方式通过指定配置文件启动:
3、zabbix对接Logstash
键值特别注意,这个是监控能否成功的关键所在
上图中的logstash配置
“zabbix_key"对应”nginxlogs“对应zabbix中的键值,必须完全一致
“zabbix_host”对应“127.0.0.1”代表的是这个监控项放在哪个zabbix_agent上
“msg”输出到zabbix上的报错信息
上图中的logstash配置
判断的“status”字段是日志中进行拆分后的字段,这里监控的web状态码403等等
"zabbix_server_host"表示的zabbix服务端地址
“zabbix_server_port”表示的zabbix服务端端口
“zabbix_value”表示的是上面定义的msg报错信息
触发器设置方式:
nodata()表示的周期T内没有数据,1-true,0-false
上图中问题表达式:表示10分钟收到错误信息
恢复表达式:表示10分钟没有收到错误信息
如下图收到nginx错误信息