【问题标题】:Logstash multiline codec ignore last event / lineLogstash 多行编解码器忽略最后一个事件/行
【发布时间】:2017-11-24 10:20:47
【问题描述】:

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] 组件初始化 线程“主”java.lang.NullPointerException 中的异常 在 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] 组件初始化 线程“主”java.lang.NullPointerException 中的异常 在 com.example.myproject.Book.getTitle(Book.java:16)

我需要最后一行。

问题: 我做错了什么还是多行编解码器有问题? - 如何解决这个问题?

【问题讨论】:

标签: logstash multiline logstash-configuration


【解决方案1】:

恐怕您使用的多行编解码器有误。让我们看看你的配置:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    相关资源
    最近更新 更多