我尝试在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"
} 请帮助我获得所需的输出。
发布于 2015-04-06 15:05:20
您的多行配置说,“如果我找到此模式,请将其与前一行保持在一起”。
您的模式“^(\s\A-Z).*”表示“要么是空格,要么是大写字母,后面是小写字母,然后是其他东西”。
所以,“foo”或"California“是匹配的,而"H3”则不然。
我建议使用一个与多行表达式开头相匹配的模式,并使用“否定式”功能将不匹配该模式的所有行连接到原始行:
filter {
multiline {
pattern => "^[A-Z][0-9]\|"
negate => 'true'
what => 'previous'
}
}
}这将以“H3”行作为开头,并将所有其他行连接到它。根据行开头的值范围,您可能需要编辑regexp。
https://stackoverflow.com/questions/29408325
复制相似问题