我正在尝试使用Logstash将日志文件存储到elasticsearch。这样做时我遇到了问题。
如果日志文件具有如下所示的相同类型的日志行,
[12 / Sep / 2016:18:23:07] VendorID = 5037 Code = C AcctID = 5317605039838520 [12 / Sep / 2016:18:23:22] VendorID = 9108 Code = A AcctID = 2194850084423218 [12 / Sep / 2016:18:23:49] VendorID = 1285代码= F AcctID = 8560077531775179 [12 / Sep / 2016:18:23:59] VendorID = 1153代码= D AcctID = 4433276107716482
其中date,vendorId,code和acctID的字段出现顺序没有改变或者没有添加新元素,那么配置文件中的过滤器(如下所示)效果很好。
\[%{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME}\] VendorID=%{INT:VendorID} Code=%{WORD:Code} AcctID=%{INT:AcctID}
假设订单更改类似于下面给出的示例,或者如果将新元素添加到其中一个日志行,则会发生grokparsefailure。
[12 / Sep / 2016:18:23:07] VendorID = 5037代码= C AcctID = 5317605039838520
[12 / Sep / 2016:18:23:22] VendorID = 9108 Code = A AcctID = 2194850084423218 [12 / Sep / 2016:18:23:49] VendorID = 1285代码= F AcctID = 8560077531775179 [12 / Sep / 2016:18:23:59] VendorID = 1153代码= D AcctID = 4433276107716482 [12 / Sep / 2016:18:24:50] AcctID = 3168124750473449 VendorID = 1065 Code = L [12 / Sep / 2016:18:24:50] AcctID = 3168124750473449 VendorID = 1065 Code = L [12 / Sep / 2016:18:24:50] AcctID = 3168124750473449 VendorID = 1065 Code = L
在此示例中,最后三个日志行与字段出现顺序的前四个日志行不同。因此,带有grok模式的过滤器消息无法解析下面三行,因为它是为前四行写的。
当我遇到这种情况时,我应该如何处理这种情况?请帮我解决这个问题。还提供任何文档的链接,以获得详细的说明。
非常感谢你。
答案 0 :(得分:0)
正如baudsp正确指出的那样,这可以通过多个grok过滤器来实现。 KV过滤器似乎是一个更好的选择,但至于grok,这是一个解决方案:
input {
stdin {}
}
filter {
grok {
match => {
"message" => ".*test1=%{INT:test1}.*"
}
}
grok {
match => {
"message" => ".*test2=%{INT:test2}.*"
}
}
}
output {
stdout { codec => rubydebug }
}
通过应用2个不同的grok过滤器,我们可以忽略日志的顺序。指定的模式基本上不关心字符串test
之前或之后的内容,而只是单独匹配它们各自的模式。
所以,对于这两个字符串:
test1=12 test2=23
test2=23 test1=12
您将获得正确的输出。测试:
artur@pandaadb:~/dev/logstash$ ./logstash-2.3.2/bin/logstash -f conf_grok_ordering/
Settings: Default pipeline workers: 8
Pipeline main started
test1=12 test2=23
{
"message" => "test1=12 test2=23",
"@version" => "1",
"@timestamp" => "2016-12-21T16:48:24.175Z",
"host" => "pandaadb",
"test1" => "12",
"test2" => "23"
}
test2=23 test1=12
{
"message" => "test2=23 test1=12",
"@version" => "1",
"@timestamp" => "2016-12-21T16:48:29.567Z",
"host" => "pandaadb",
"test1" => "12",
"test2" => "23"
}
希望有所帮助