我正在尝试通过grok过滤器解析一些非常不同的异常,因此我在rubular.com的帮助下编写了一个grok过滤器来解析每种类型的异常。过滤器是:
grok {
match => { message => "^(?<year>\d{4})-(?<month>\d{1,2})-(?<day>\d{1,2})\W(?<hours>\d{2}):(?<minutes>\d{2}):(?<seconds>\d{2})(,)[0-9]*(.*)(?<log_level>(ERROR|INFO)) (?<exception>(.*\n^Axis.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*)|(com.*trying.*\ncom.*is:.*\n.*java.*)|(com.*\n^org.*\n###.*non valido\n\n.*^###.*\n^###.*\n^###.*)|(.*trying.*\n^com.*ServiceException.*\n### Error querying.*\n\n.*\n^###.*\n.*)|(.*trying.*\n^com.*ServiceException.*\n^###.*\n^###.*)|(.*trying.*\n^com.*)|(.*\n^org.*\n###.*Exception.*\n### Cause:.*)|(com.*\n^org.*\n###.*)|(.*\n^java.*CORBA.*\n.*)|(.*\n^java*.*)|(com.*\n^com.*)|(.*null\n^Axis.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*)|(.*\n))"}
}
你可以在异常字段中看到很多OR条件和很多\ n来取回回车。问题在于,根据我的理解,Logstash一次只能读取一行并且不能匹配多行(因此,即使在rubular上这种模式工作正常,它也不会在logstash中)。 如何正确过滤异常?
答案 0 :(得分:0)
你可以在grok之前进行多行化,例如java例外:
multiline {
type => %sometype
pattern => "(^\s)"
what => previous
}
所以这会将所有以空格开头的行追加到前一行。之后你可以使用grok过滤器。
哦,您可以变异以避免多行后出现'\ n'符号:
mutate {
gsub => ["message", "\n", " "]
}
之后您就可以过滤多行消息了。