繁体   English   中英

Logstash grok多行消息

[英]Logstash grok multiline message

我的日志格式如下:

2014-06-19 02:26:05,556 INFO ok
2014-06-19 02:27:05,556 ERROR
 message:space exception
         at line 85
 solution:increase space
          remove files   

有两种类型的事件:

-log就像第一行一样

-log在多行上像第二行一样

我能够处理一行事件,但我无法处理第二种类型,我想将消息存储在一个变量中,而解决方案存储在另一个变量中。

这是我的配置:

input {
 file {
    path => ["logs/*"]
    start_position => "beginning"
    codec => multiline {
                   pattern => "^%{TIMESTAMP_ISO8601} "
                   negate => true
                   what => previous
    }       
 }
}
filter {
 #parsing of one line event
 grok {
 patterns_dir => "./patterns"
 match=>["message","%{TIMESTAMP_ISO8601:timestamp} %{WORD:level} ok"]
 }
#the parsing fail, so we assumed we are in multiline events, now I process them and I am stuck when I am getting to the new line.
if "_grokparsefailure" in [tags] {
 grok {
 patterns_dir => "./patterns"
 match=>["message","%{TIMESTAMP_ISO8601:timestamp} %{WORD:level}\r\n"]
 }
}

}

所以这就是我所做的,我想在我的控制台输出中有以下内容:

{
"@timestamp" => "2014-06-19 00:00:00,000"
"path" => "logs/test.log"
"level"=>"INFO"
},
{
"@timestamp" => "2014-06-19 00:00:00,000"
"path" => "logs/test.log"
"level"=>"ERROR"
"message" => "space exception at line 85"
"solution"=>"increase space remove files"
}

具体来说,我想得到两个单词之间的所有表达式(消息变量的“消息”和“解决方案”,“解决方案”和解决方案变量的事件结束),并且无论表达式是否在一个上或多行。

提前致谢

对于multiline grok,最好使用特殊标志来表示模式字符串:

grok {
    match => ["message", "(?m)%{SYSLOG5424LINE}"]
}

看起来你有两个问题:

您需要正确组合多行:

filter
{
    multiline
   {
        pattern => "^ "
        what => "previous"
   }
}

这会将以空格开头的任何行合并到上一行。 你可能最终不得不使用“下一个”而不是“前一个”。

替换换行符

我不相信grok匹配换行符。

通过在过滤器部分中执行以下操作,我解决了这个问题。 这应该 grok部分之前

mutate
{
    gsub => ["message", "\n", "LINE_BREAK"]
}

这使我能够将多线作为一条大线而不是只匹配到“\\ n”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM