服务端部署logstash,将filebeat传过来的非结构化日志转为json格式,并新增几个字段
#部署logstash
https://www.elastic.co/guide/en/logstash/7.17/installing-logstash.html#package-repositories
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
apt-get install apt-transport-https -y
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-7.x.list
apt-get update && apt-get install logstash=7.17.19 -y
#冒号后面的字段名字可以自定义任意名字
cat > /etc/logstash/conf.d/logstash.conf << 'EOF'
input {
beats {
add_field => {"beatType" => "filebeat"}
port => 5044
}
}
filter {
grok {
match => {"message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:[%{POSINT:syslog_pid}])?:%{GREEDYDATA} question for '(?<domain>[^']+)' from %{GREEDYDATA:client_ip}"}
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "powerdns_recursor_test"
user => "elastic"
password => "xxxxx"
}
}
EOF
上面的grok正则匹配,拿去kibana调试一下,看是否能取出想要的字段和值。需要复制一段非结构化日志
- 在devtools工具里
- 找到grok debugger
Sample Data:
Apr 9 11:48:41 rec-pdns-d2 pdns_recursor[4370]: 3 [2147048/2] question for 'pds-app-cn-beijing.cn-beijing.log.aliyuncs.com|A' from 192.168.187.208
Grok Pattern:
%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:[%{POSINT:syslog_pid}])?:%{GREEDYDATA} question for '(?<domain>[^']+)' from %{GREEDYDATA:client_ip}
能获取完整json字段为成功
{
"syslog_hostname": "rec-pdns-d2",
"syslog_timestamp": "Apr 9 11:48:41",
"domain": "pds-app-cn-beijing.cn-beijing.log.aliyuncs.com|A",
"client_ip": "192.168.187.208",
"syslog_program": "pdns_recursor[4370]"
}
然后启动logstash
systemctl start logstash
systemctl enable logstash
#看日志是否有报错。正常是格式问题或者正则转义问题
journalctl -f -u logstash
进入head查看是否有数据和新增的字段
主要是client_ip、domain字段
进入kibana添加索引并查看discover是否有字段显示
添加索引,并查看是否有字段
然后打开discover查看,有数据就是把非结构化日志成功转换了
过滤带有-号的domain字段的值,不然有些没匹配上的数据,都显示出来了,所以筛选出有域名的值
#输入下面过滤指令并搜索。因为我这里有历史数据,不断的调试,所以需要过滤出来。正常情况下,grok匹配之后会筛选出合适的日志再写入es索引的。
NOT domain: *-*
然后添加dashborad统计图,什么IP地址访问了什么域名,全公司人员谁在访问了什么网站、次数等等,一目了然。
把需要监控的字段添加进去
最终效果
注意:
grok的正则匹配并不是通用的,它内置了常用的syslog和其它服务的模板变量,由于powerdns没有提供相关的日志转换规则,所以有一半的正则是我自己自定义的,调试很久,最终才转成想要的效果。因为powerdns日志有多种非结构化的格式,弱水三千、只取一瓢,挑选了1条能够清晰看到来源IP和访问域名的日志格式,进行自定义正则过滤。
如果kibana没有字段显示,那就是logstash中grok正则配置错误,或者没有成功写入到es中。