filter插件位于input和output中间的位置,我这边工作中主要用来处理event内字段的过滤。下面来具体说一下:
上回经过input将多行日志合并为一行进行采集,采集到的结果如下:
2017-08-03T02:55:48.382Z testserver2 2017-08-03 10:55:45,203 INFO smg.message.cdnws||||cd /data/Video && rsync -avrtuz -R ./2017/08/02/d14853fd5fe24d1691c23e7829367427.mp4.m3u8 chinacache@rsync4.upload.wscdns.com::chinacache_video --password-file=/etc/rsync_ws.passwd||||{"command":"[/usr/local/microservice/rsyncCommand.sh, cd /data/Video, rsync -avrtuz -R ./2017/08/02/d14853fd5fe24d1691c23e7829367427.mp4.m3u8 chinacache@rsync4.upload.wscdns.com::chinacache_video --password-file=/etc/rsync_ws.passwd]", "errorMessage":"null", "infoMessage": sending incremental file list 2017/08/02/d14853fd5fe24d1691c23e7829367427.mp4.m3u8 sent 279 bytes received 30 bytes 123.60 bytes/sec total size is 108 speedup is 0.35
然后发现logstath会在日志的前面加上时间戳和服务器的名字。在实际业务中还是采用原有日志的时间戳,所以使用filter插件来过滤掉这些不用的字段。
主要使用的filter插件有grok和mutate两个插件。
grok:用来对日志进行正则匹配然后分配给相应的字段。
grok{match => ["message","%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:logmessage}"]}
在这个配置中message代表了原来的日志消息。将其通过正则匹配出三个字段来,时间戳匹配成timestamp,日志等级匹配成level,剩下的信息匹配成logmessage。这样就将原有的message信息分解成了三个字段信息。
mutate:用来对现有的字段进行增加删除处理。
mutate {
add_field => {"servicename" => "testName"}
remove_field => "message"
remove_field => "@timestamp"
remove_field => "@version"
remove_field => "host"
remove_field => "path"
remove_field => "tags"
}
其中删除的字段为logstath自己添加的字段信息,message因为已经分解为三个字段所以不再需要。添加的字段可以写死为一个字符串,相当于给日志信息做个标签名称。
现在的配置文件为:
input{
file{
path=>"/home/testfiles/command_service_amq.log" //日志文件地址
start_position=>"beginning" //在第一次读文件时是否从第一行进行读取 默认为end
codec => multiline {
pattern => "^%{TIMESTAMP_ISO8601:timestamp}" //正则匹配,以iso8601时间为开始
negate => true //如果没匹配则取消正则,没理解,反正true跟false都试试
what => "previous" //和上一行组成同一event
}
}
}
filter{
grok{match => ["message","%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level}: %{GREEDYDATA:syslog_message}"]}
mutate {
add_field => {"servicename" => "testName"}
remove_field => "message"
remove_field => "@timestamp"
remove_field => "@version"
remove_field => "host"
remove_field => "path"
remove_field => "tags"
}
//这个if用于将日志级别是debug的日志抛掉
if [level] == "DEBUG" {
drop {}
}
}
//为了输出好看一些将其变为json输出
output{stdout{codec => json}}
最后的输出结果为:
{"level":"INFO","logmessage":"smg.message.cdnws||||cd /data/Video && rsync -avrtuz -R ./2017/08/02/d14853fd5fe24d1691c23e7829367427.mp4.m3u8 chinacache@rsync4.upload.wscdns.com::chinacache_video --password-file=/etc/rsync_ws.passwd||||{\"command\":\"[/usr/local/microservice/rsyncCommand.sh, cd /data/Video, rsync -avrtuz -R ./2017/08/02/d14853fd5fe24d1691c23e7829367427.mp4.m3u8 chinacache@rsync4.upload.wscdns.com::chinacache_video --password-file=/etc/rsync_ws.passwd]\", \"errorMessage\":\"null\", \"infoMessage\":\n\rsending incremental file list\n\r2017/08/02/d14853fd5fe24d1691c23e7829367427.mp4.m3u8\n\rsent 279 bytes received 30 bytes 123.60 bytes/sec\n\rtotal size is 108 speedup is 0.35","servicename":"cptn1","timestamp":"2017-08-03 13:48:09,564"}
大功告成!!!有问题之处烦请在留言中指出,非常感谢。