首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Logstash - grok多行

Logstash - grok多行
EN

Stack Overflow用户
提问于 2015-04-02 08:26:15
回答 1查看 3.4K关注 0票数 1

我尝试在grok过滤器中使用多行,但它不能正常工作。

我的日志是

代码语言:javascript
复制
H3|15:55:04:760|exception|not working properly
message:space exception
 at line number 25

我的conf文件是

代码语言:javascript
复制
input { file {

    path => "logs/test.log"
    start_position => beginning
    sincedb_path => "/dev/null"
  }}
filter{

 multiline {

    pattern => "^(\s|[A-Z][a-z]).*"
    what => "previous"
  }
if [message] =~ /H\d+/{

grok {

match => ["message", "(?m)%{USERNAME:level}\|%{TIME:timestamp}\|%{WORD:method}\|%{GREEDYDATA:error_Message}" ]
  }
   }

   else {

   grok {

match => ["message", "(?m)%{GREEDYDATA:error_Message}" ]
  }
   }
  }

output {elasticsearch { host => "localhost"  protocol => "http" port => "9200" }}

我能够处理日志文件的第一行,但是第二行日志文件在我想要使用多行的地方不能工作。

我想要的输出

代码语言:javascript
复制
{

"@timestamp" => "2014-06-19 00:00:00,000"
"path" => "logs/test.log"
"level"=>"H3"
"timestamp"=>15:55:04:760
"method"=>exception
"error_message"=>not working properly
},
{
"@timestamp" => "2014-06-19 00:00:00,000"
"path" => "logs/test.log"
"error_message" => "space exception at line 25"
}   

请帮助我获得所需的输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-06 15:05:20

您的多行配置说,“如果我找到此模式,请将其与前一行保持在一起”。

您的模式“^(\s\A-Z).*”表示“要么是空格,要么是大写字母,后面是小写字母,然后是其他东西”。

所以,“foo”或"California“是匹配的,而"H3”则不然。

我建议使用一个与多行表达式开头相匹配的模式,并使用“否定式”功能将不匹配该模式的所有行连接到原始行:

代码语言:javascript
复制
filter {
    multiline {
      pattern => "^[A-Z][0-9]\|"
      negate => 'true'
      what => 'previous'
    }
  }
}

这将以“H3”行作为开头,并将所有其他行连接到它。根据行开头的值范围,您可能需要编辑regexp。

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

https://stackoverflow.com/questions/29408325

复制
相关文章

相似问题

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