zabbix监控ELK导入的项目日志

Posted DonotCTR

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zabbix监控ELK导入的项目日志相关的知识,希望对你有一定的参考价值。

1、ELK监控概述

    ELK日志分析系统在运维使用过程中,很多情况都是通过filebeat接入,把日志数据放到Elasticsearc中,这样子原始化的项目日志,对于绝大部分开发来说,还是很好用的。但是仅仅如此的话,ELK存在的必须性就不是很大了,为了更好地使用ELK这个庞大的日志分析系统,可以通过logstash对于日志数据进行数据清洗,通过logstash中的zabbix插件将日志中的错误信息通过zabbix实现告警功能。

如上图中,用户可以通过kibana查看日志相关信息,logstash通过zabbix插件可以接到zabbix服务实现错误日志告警。其他相关功能不再这里做其他介绍。


2、Logstash规则

2.1、nginx日志格式


$ sudo vim /etc/nginx/nginx.conf
{
....
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


# /usr/share/logstash/bin/logstash-plugin   install logstash-output-zabbix   #部署zabbix插件

2.3、logstash配置


# cd /etc/logstash/conf.d/
# 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文件是否有配置错误:


# /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/nginx-log.conf  -t

启动方式通过指定配置文件启动:


# nohup  /usr/share/logstash/bin/logstash /etc/logstash/conf.d/  >& /dev/null &

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错误信息



以上是关于zabbix监控ELK导入的项目日志的主要内容,如果未能解决你的问题,请参考以下文章

Zabbix与ELK整合实现对日志数据的实时监控

1,zabbix 监控Elk日志

1,zabbix 监控Elk日志

ELK+zabbix监控tomcat报警及错误日志--报警

zabbix怎么监控nginx

zabbix怎么监控linux服务器日志