我已将 logstash 管道配置为向 elastic 报告。我能够读取日志文件。我的日志文件包含多行消息,但每一行都作为一条消息报告给 elastic。以下是我的 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。请帮我解决这个问题。
请帮我解决这个问题。
最佳答案
通过使用
codec => multiline {
pattern => "^%{LOGLEVEL}"
negate => "false"
what => "next"
}
您告诉编解码器加入任何匹配 ^%{LOGLEVEL}
的行以加入下一行。这会将第一行连接到第二行,因为第一行匹配 ^%{LOGLEVEL}
。其他行将被忽略,模式将不会继续匹配并向下连接同一行。因此,您最终会得到一堆乱七八糟的部分日志事件。
你会想要使用
codec => multiline {
pattern => "^%{LOGLEVEL}"
negate => "true"
what => "previous"
}
相反。这告诉 logstash 将任何与 ^%{LOGLEVEL}
不匹配的行加入到上一行。这可确保事件始终以 ^%{LOGLEVEL}
匹配行开始,这正是您想要的。
关于logstash 多行编解码器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46161726/