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)
我需要最后一行。
问题: 我做错了什么或多线编解码器有问题吗? - 如何解决这个问题?
答案 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中创建一个新文档。