logstash多行编解码器不起作用

时间:2017-09-11 17:58:19

标签: logstash

我已将logstash管道配置为弹性报告。我能够读取日志文件。我的日志文件包含多行消息,但每行都被报告为弹性的一条消息。以下是我的logstash配置文件

LogConf文件:

input {
        file {
            path => ["abc.log" ]
            start_position => "beginning"
            codec => multiline
            {
                pattern => "^%{LOGLEVEL}"
                negate => "false"
                what => "next"
            }
        }
    }
    filter {

    }
    output {
        # only for debug purposes
        stdout {
            codec => rubydebug
        }
        elasticsearch {
            hosts => ["http://abcd:9200"]
            index => "logstash"
        }
    }

日志文件:

DEBUG - LogBO={
    message:############ ##############
------------>>!User Info[################################]
------------>>!Debug Info[ ############################# ]
***************isABCEnabled*********************true
}
DEBUG - LogBO={
    message:############ ##############
------------>>!User Info[################################]
------------>>!Debug Info[ ############################# ]
***************isABCEnabled*********************true
}

我能够看到日志被报告给Elastic,但由于每行日志都是单独的消息。我想要整个日志

DEBUG - LogBO={
    message:############ ##############
------------>>!User Info[################################]
------------>>!Debug Info[ ############################# ]
***************isABCEnabled*********************true
}

将被报告为Elastic的单个消息。请帮我解决问题。

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

使用

codec => multiline {
    pattern => "^%{LOGLEVEL}"
    negate => "false"
    what => "next"
}

您告诉编解码器加入与^%{LOGLEVEL}匹配的任何行以加入下一行。这会将第一行连接到第二行,因为第一行与^%{LOGLEVEL}匹配。其他行将被忽略,模式将不会继续匹配并将同一行连接起来。因此,你最终会得到一堆部分日志事件。

您需要使用

codec => multiline {
    pattern => "^%{LOGLEVEL}"
    negate => "true"
    what => "previous"
}

代替。这告诉logstash将任何与^%{LOGLEVEL}不匹配的行加入到上一行。这可以确保事件始终以^%{LOGLEVEL}匹配行开头,并且是您想要的。