我有两个相关问题。第一个是如何最好地处理具有“混乱”间距等的日志,第二个,我将单独询问,是如何处理具有任意属性值对的日志。 (看:Logstash Grok 过滤器用于具有任意属性值对的日志 https://stackoverflow.com/questions/31884204/logstash-grok-filter-for-logs-with-arbitrary-attribute-value-pairs )
因此,对于第一个问题,我的日志行如下所示:
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
Using http://grokdebug.herokuapp.com/ 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 之间有额外的空间,但这也感觉很混乱。
另外,我如何获取日志时间戳来替换@timestamp,这似乎是logstash摄取日志的时间,这是我们不想要/不需要的。
显然,我刚刚开始使用 ELK 和 grok,因此也感谢指向有用资源的指针。