我的日志格式如下:
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在一行上像第一个
- 多行上的日志,如第二个
我能够处理一行事件,但我无法处理第二种类型,我希望将消息存储在一个变量中,将解决方案保存在另一个变量中。
这是我的配置:
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"]
}
}
}
所以这就是我所做的,我希望在我的控制台输出中有以下内容:
{
"@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""解决方案"对于消息变量,"解决方案"以及结束解决方案变量的事件),无论表达式是在一行还是多行。
提前致谢
答案 0 :(得分:20)
对于多行格斗,最好使用特殊标志作为模式字符串:
grok {
match => ["message", "(?m)%{SYSLOG5424LINE}"]
}
答案 1 :(得分:12)
看起来你有两个问题:
您需要正确组合多线:
filter
{
multiline
{
pattern => "^ "
what => "previous"
}
}
这会将以空格开头的任何行合并到上一行。您最终可能不得不使用“下一个”而不是“之前的”。
替换换行符
我不相信grok在换行符之间匹配。
通过在过滤器部分执行以下操作,我解决了这个问题。这应该是之前 grok部分:
mutate
{
gsub => ["message", "\n", "LINE_BREAK"]
}
这让我可以将多线作为一条大线而不是只匹配到“\ n”。