Grok没有正确匹配多行日志条目?

时间:2018-01-02 15:17:25

标签: elasticsearch logstash multiline logstash-grok filebeat

我已经连续几个星期了,而且我似乎无法解决这个问题。

我试图让所有这些线条适合与grok的多线匹配,但它只会拾取最后一条线,甚至丢弃线条开头的数字。

11:31:03.936    <           :     1>    5: Load times per type (ms):
12: aaaaaa.aaaaaaaaa.aaaaaaa.aaaaaaa
1: bbbb.bbbb.bbbbbbbbbbbbb.bbbbbbbbb
3: cccc.cccccccc.ccccccccccc.cccccc
64: ddd.dddddddddddd.ddddddd.ddddddd

预期结果:

message_processed = Load times per type (ms):
12: aaaaaa.aaaaaaaaa.aaaaaaa.aaaaaaa
1: bbbb.bbbb.bbbbbbbbbbbbb.bbbbbbbbb
3: cccc.cccccccc.ccccccccccc.cccccc
64: ddd.dddddddddddd.ddddddd.ddddddd

实际结果:

message_processed = ddd.dddddddddddd.ddddddd.ddddddd

我使用以下grok模式:

grok {
        match => [ "message" , "%{TIME:time}.*%{NUMBER:loglevel}:\s%{GREEDYDATA:message_processed}" ]
    }

在Windows服务器上使用filebeat运送到logstash,并在filebeat.yml中使用以下多行配置:

multiline.pattern: ^[0-9]{2}\:[0-9]{2}\:[0-9]{2}
multiline.negate: true
multiline.match: after

我已尝试使用(?m)标志,但无效,根据官方文档,使用带有filebeat的多行编解码器是不行的。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

尝试以下方法:

%{TIME:time}.*%{NUMBER:loglevel}:\s(?<message_processed>(.|\‌​r|\n)*)

正如所指出的那样,here GREEDYDATA(?<message>(.|\r|\n)*)期间不会与换行符匹配。所以上面对我有用。

使用https://grokconstructor.appspot.com/do/match上的多行配置查看示例的结果: results