我有两个相关的问题。首先是如何最好地记录具有"凌乱"间距等等,我将分别提出的第二个问题是如何处理具有任意属性 - 值对的日志。 (见: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
使用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}这么多。这告诉我,我并没有以最好的方式做到这一点。我应该为hex id创建更具体的模式吗?我认为我需要loglevel和logtype之间的%{SPACE},因为日志中INFO和METERING之间有额外的空间,但这也感觉很糟糕。
另外,如何获取日志的时间戳来替换@timestamp,这似乎是记录日志的时间,这是我们不想要/不需要的。
显然,我刚刚开始使用ELK和grok,所以我们也非常感谢有用资源的指示。
答案 0 :(得分:1)
您可以使用现有模式代替NOTSPACE
,UUID
。此外,如果只有一个空格,则无需使用SPACE
模式,您可以将其删除。我也是为了捕获USERNAME
字段而使用http
模式(可能是错误命名的)。
所以它会像这样,你只有一个SPACE
模式来捕获多个空格。
示例日志行:
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
Grok模式:
%{TIME:timestamp} \[%{USERNAME:http}\] %{WORD:loglevel}%{SPACE}%{WORD:logtype} - msg=%{UUID:msg} %{WORD:action} job=%{UUID:job} data=%{UUID:data}
Grok将吐出来:
{
"timestamp": [
[
"14:46:16.603"
]
],
"HOUR": [
[
"14"
]
],
"MINUTE": [
[
"46"
]
],
"SECOND": [
[
"16.603"
]
],
"http": [
[
"http-nio-8080-exec-4"
]
],
"loglevel": [
[
"INFO"
]
],
"SPACE": [
[
" "
]
],
"logtype": [
[
"METERING"
]
],
"msg": [
[
"93e6dd5e-c009-46b3-b9eb-f753ee3b889a"
]
],
"action": [
[
"CREATE_JOB"
]
],
"job": [
[
"a820018e-7ad7-481a-97b0-bd705c3280ad"
]
],
"data": [
[
"71b1652e-16c8-4b33-9a57-f5fcb3d5de92"
]
]
}
答案 1 :(得分:0)
还可以使用\ s *代替SPACE模式。
对于删除字段,您可以使用mutate插件,有一个名为" remove_field" - > https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-remove_field
如果删除此字段,则必须在kibana中添加新索引。因为如果没有其他选择,kibana会使用@timestamp字段对事件进行排序。