首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Logstash grok多行消息

Logstash grok多行消息
EN

Stack Overflow用户
提问于 2014-06-19 21:36:45
回答 2查看 49.1K关注 0票数 26

我的日志格式如下:

代码语言:javascript
复制
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

我可以处理一行事件,但不能处理第二种类型,我希望将消息存储在一个变量中,而将解决方案存储在另一个变量中。

这是我的配置:

代码语言:javascript
复制
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"]
 }
}

}

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

代码语言:javascript
复制
{
"@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"
}

具体地说,我希望获得两个单词之间的所有表达式( message变量的“message”和" solution“,解决方案变量的"solution”和事件结束),并且无论表达式是在一行还是多行上。

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2015-01-30 16:25:11

对于多行grok,最好对pattern字符串使用特殊的标志:

代码语言:javascript
复制
grok {
    match => ["message", "(?m)%{SYSLOG5424LINE}"]
}
票数 30
EN

Stack Overflow用户

发布于 2014-08-11 22:23:52

看起来你有两个问题:

你需要正确的组合你的多行代码:

代码语言:javascript
复制
filter
{
    multiline
   {
        pattern => "^ "
        what => "previous"
   }
}

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

替换换行符

我不相信grok会在换行符上匹配。

我通过在您的过滤器部分中执行以下操作来解决此问题。这应该在 grok部分之前执行

代码语言:javascript
复制
mutate
{
    gsub => ["message", "\n", "LINE_BREAK"]
}

这允许我将多行作为一个大行来理解,而不是只匹配到"\n“。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24307965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档