我有两个相关的问题。首先是如何最好地了解具有“杂乱”间距等的日志,第二个是我将单独询问的,是如何处理具有任意属性值对的日志。(请参阅:logstash grok 过滤器,用于具有任意属性值对的日志)
所以对于第一个问题,我有一个如下所示的日志行:
14:46:16.603 [http-nio-8080-exec-4] INFO METERING - msg=93e6dd5e-c009-46b3-b9eb-f753ee3b889a CREATE_JOB job=a820018e-7ad7-481a-97b0-bd705c3280ad data=71b1652e-16c8-4b33-9a57-f5fcb3d5de92
使用http://grokdebug.herokuapp.com/我最终能够想出适用于这一行的以下 grok 模式:
%{TIME:timestamp} %{NOTSPACE:http} %{WORD:loglevel}%{SPACE}%{WORD:logtype} - msg=%{NOTSPACE:msg}%{SPACE}%{WORD:action}%{SPACE}job=%{NOTSPACE:job}%{SPACE}data=%{NOTSPACE:data}
使用以下配置文件:
input {
file {
path => "/home/robyn/testlogs/trimmed_logs.txt"
start_position => beginning
sincedb_path => "/dev/null" # for testing; allows reparsing
}
}
filter {
grok {
match => {"message" => "%{TIME:timestamp} %{NOTSPACE:http} %{WORD:loglevel}%{SPACE}%{WORD:logtype} - msg=%{NOTSPACE:msg}%{SPACE}%{WORD:action}%{SPACE}job=%{NOTSPACE:job}%{SPACE}data=%{NOTSPACE:data}" }
}
}
output {
file {
path => "/home/robyn/filteredlogs/trimmed_logs.out.txt"
}
}
我得到以下输出:
{"message":"14:46:16.603 [http-nio-8080-exec-4] INFO METERING - msg=93e6dd5e-c009-46b3-b9eb-f753ee3b889a CREATE_JOB job=a820018e-7ad7-481a-97b0-bd705c3280ad data=71b1652e-16c8-4b33-9a57-f5fcb3d5de92","@version":"1","@timestamp":"2015-08-07 T17:55:16.529Z","host":"hlt-dev","path":"/home/robyn/testlogs/trimmed_logs.txt","timestamp":"14:46:16.603","http":"[http-nio-8080-exec-4]","loglevel":"INFO","logtype":"METERING","msg":"93e6dd5e-c009-46b3-b9eb-f753ee3b889a","action":"CREATE_JOB","job":"a820018e-7ad7-481a-97b0-bd705c3280ad","data":"71b1652e-16c8-4b33-9a57-f5fcb3d5de92"}
这几乎是我想要的,但我觉得这是一个非常笨拙的模式,特别是需要使用 %{SPACE} 和 %{NOSPACE} 这么多。这向我表明,我并没有真正以最好的方式做到这一点。我应该为十六进制 ID 创建更具体的模式吗?我认为我需要 loglevel 和 logtype 之间的 %{SPACE} ,因为日志中的 INFO 和 METERING 之间有额外的空间,但这也让人感觉很笨拙。
另外,我如何获取日志的时间戳来替换似乎是 logstash 摄取日志的时间的@timestamp,这是我们不想要/不需要的。
显然,我刚刚开始使用 ELK 和 grok,因此也感谢指向有用资源的指针。