我尝试在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"
}
请帮助我获得所需的输出。
答案 0 :(得分:2)
您的多行配置显示,"如果我找到此模式,请将其与前一行"保持一致。
你的模式" ^(\ s | [A-Z] [a-z])。*"说"要么是空格,要么是大写字母后跟小写字母,然后是其他东西"。
所以," FOO"或者"加州"会匹配,但" H3"不会告发'吨
我建议使用与多线表达式的开头相匹配的模式,并使用“否定”#39;功能,使所有不匹配该模式的行连接到原始行:
filter {
multiline {
pattern => "^[A-Z][0-9]\|"
negate => 'true'
what => 'previous'
}
}
}
这将采取" H3 |"以行为开头,并将所有其他行连接到它。根据行开头的值范围,您可能需要编辑正则表达式。