我终于成功地从我的日志文件中解析了多行日志消息。请注意,您的日志消息可能会略有不同,需要更改 grok 模式。主要修复是在 grok 过滤器之前放置多行过滤器,并在它和 grok 过滤器之间进行 drop{}。重要提示:使用Grok 调试器来调试您的 grok 过滤器。
input {
stdin {
type => "log4j"
}
}
filter {
if [type] == "log4j" {
multiline {
pattern => "^[\d]{4}\-[\d]{2}\-[\d]{2} "
negate => true
what => previous
}
if "_grokparsefailure" in [tags] {
drop { }
}
grok {
match => {
"message" => "(?<logdate>[\d]{4}\-[\d]{2}\-[\d]{2} [\d]{2}:[\d]{2}:[\d]{2},[\d]{3})%{SPACE}%{NUMBER:unknown1}%{SPACE}%{LOGLEVEL:severity}%{SPACE}\[(?<logger>[^\]]+)\]%{SPACE}\((?<thread>[^\)]+)\)%{SPACE}%{GREEDYDATA:message}"
}
overwrite => [ "message" ]
}
if !("_grokparsefailure" in [tags]) {
date {
match => [ "logdate", "YYYY-MM-dd HH:mm:ss,SSS"]
}
}
}
}
output {
# Print each event to stdout.
stdout {
codec => json
}
}