带有logstash的多行日志(数组)

时间:2015-12-06 13:16:30

标签: logstash

我想用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] => 

我原以为这会是单一的“消息:” 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

第一步是让多行{}(编解码器或过滤器)正常工作。如果是这样,你应该根据你的例子得到三个文件。

你的多线结构可以被读作“当我找到以ERROR开头的行时,保留它与之前的”,我认为这不是你想要的。听起来你应该添加'否定'选项。

如果这解决了多线问题,那么你应该运行一个grok {}来拉开前面的常用内容(级别,日期,时间)。然后第二个grok {}可以将parens中的所有字段与其余字段分开。可能会将parens中的数据馈送到kv {}(“键值”)过滤器以生成键/值对中的字段。