我想用logstash解析日志文件,其中包含单行和多行。 [例如,前2行有1行日志条目,而第3行有多行登录]
ERROR - 2015-12-05 20:48:53 --> Could not find page
ERROR - 2015-12-05 20:48:53 --> Could not find VAR
ERROR - 2015-12-05 20:48:59 --> Array
(
[id] => 12344
[studentid] => 33
[fname] =>
[lname] =>
[address] => tokyo
)
此日志条目从客户端(logstatsh-forwarder)转发,该类型将类型设置为“multilineclient”
filter{
if [type] == "multilineclient" {
multiline {
pattern => "^ERROR"
what => "previous"
}
grok{
match => {"message" => "%{LOGLEVEL:loglevel}\s+%{TIMESTAMP_ISO8601:timestamp}\s+%{DATA:message}({({[^}]+},?\s*)*})?\s*$(?<stacktrace>(?m:.*))?"}
}
mutate {
remove => [ "@loglevel" ]
}
}
}
我确实尝试过Grok Debugger和grok constructer(但是无法解决LOGLEVEL启动日志文件的问题),
我的多行日志(数组)被解析为单独的消息。
message: [id] =>
message: [studentid] =>
message: [fname] =>
我原以为这会是单一的“消息:” 有什么建议吗?
答案 0 :(得分:0)
第一步是让多行{}(编解码器或过滤器)正常工作。如果是这样,你应该根据你的例子得到三个文件。
你的多线结构可以被读作“当我找到以ERROR开头的行时,保留它与之前的”,我认为这不是你想要的。听起来你应该添加'否定'选项。
如果这解决了多线问题,那么你应该运行一个grok {}来拉开前面的常用内容(级别,日期,时间)。然后第二个grok {}可以将parens中的所有字段与其余字段分开。可能会将parens中的数据馈送到kv {}(“键值”)过滤器以生成键/值对中的字段。