Logstash - grok multiline

时间:2015-04-02 08:26:16

标签: logstash

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

我的日志

H3|15:55:04:760|exception|not working properly
message:space exception
 at line number 25

我的conf文件是

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" }}

我能够处理第一行日志文件,但第二行日志文件无效,我想使用多行

输出我希望

{

"@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"
}   

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

1 个答案:

答案 0 :(得分:2)

您的多行配置显示,"如果我找到此模式,请将其与前一行"保持一致。

你的模式" ^(\ s | [A-Z] [a-z])。*"说"要么是空格,要么是大写字母后跟小写字母,然后是其他东西"。

所以," FOO"或者"加州"会匹配,但" H3"不会告发'吨

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

filter {
    multiline {
      pattern => "^[A-Z][0-9]\|"
      negate => 'true'
      what => 'previous'
    }
  }
}

这将采取" H3 |"以行为开头,并将所有其他行连接到它。根据行开头的值范围,您可能需要编辑正则表达式。