我的日志格式如下:
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
与第二行类似的多行上的-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变量的“message”和" solution“,解决方案变量的"solution”和事件结束),并且无论表达式是在一行还是多行上。
提前感谢
发布于 2015-01-30 16:25:11
对于多行grok,最好对pattern字符串使用特殊的标志:
grok {
match => ["message", "(?m)%{SYSLOG5424LINE}"]
}发布于 2014-08-11 22:23:52
看起来你有两个问题:
你需要正确的组合你的多行代码:
filter
{
multiline
{
pattern => "^ "
what => "previous"
}
}这会将任何以空格开头的行合并到前一行中。你可能最终不得不使用“下一步”而不是“前一步”。
替换换行符
我不相信grok会在换行符上匹配。
我通过在您的过滤器部分中执行以下操作来解决此问题。这应该在 grok部分之前执行:
mutate
{
gsub => ["message", "\n", "LINE_BREAK"]
}这允许我将多行作为一个大行来理解,而不是只匹配到"\n“。
https://stackoverflow.com/questions/24307965
复制相似问题