Logstash多行编解码器忽略上一个事件/行

时间:2017-11-24 10:20:47

标签: logstash multiline logstash-configuration

Logstash多行编解码器忽略我的上一个事件(行),直到发送下一个日志包。

我的logstash.conf:

input {
    }
    http {
        port => "5001"
        codec => multiline {
            pattern => "^\[%{TIMESTAMP_ISO8601}\]"
            negate => true
            what => previous
            auto_flush_interval => 15
        }
    }
}

filter{
    grok {
        match => { "message" => "(?m)\[%{TIMESTAMP_ISO8601:timestamp}\]\s\<%{LOGLEVEL:log-level}\>\s\[%{WORD:component}\]\s%{GREEDYDATA:log-message}" 
    }
}

output {
    elasticsearch {
        hosts => "elasticsearch:9200"
        index => "%{+YYYY-MM-dd}"
    }
}

此外,使用 auto_flush_interval 的解决方案无效。

例如:

使用Postman

输入

  

[2017-07-11 22:32:12.345] [KCU]组件初始化   线程“main”java.lang.NullPointerException中的异常           at com.example.myproject.Book.getTitle(Book.java:16)   [2017-07-11 22:32:16.345] [KCU]返回状态1

输出 - 只有一个事件(应该是两个):

  

[2017-07-11 22:32:12.345] [KCU]组件初始化   线程“main”java.lang.NullPointerException中的异常           在com.example.myproject.Book.getTitle(Book.java:16)

我需要最后一行。

问题: 我做错了什么或多线编解码器有问题吗? - 如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我担心您使用多行编解码器是错误的。我们来看看您的配置:

codec => multiline {
            pattern => "^\[%{TIMESTAMP_ISO8601}\]"
            negate => true
            what => previous
        }

它表示如果日志没有(negate => true)以ISO时间戳(pattern)开头,则将其附加到上一个日志行(what => previous)。

但是您缺少的日志以ISO时间戳开头:

  

[2017-07-11 22:32:16.345] [KCU]返回状态1

因此它不会附加到以前的日志行,而是在Elasticsearch中创建一个新文档。