我已将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的单个消息。请帮我解决问题。
请帮我解决这个问题。
答案 0 :(得分:1)
使用
codec => multiline {
pattern => "^%{LOGLEVEL}"
negate => "false"
what => "next"
}
您告诉编解码器加入与^%{LOGLEVEL}
匹配的任何行以加入下一行。这会将第一行连接到第二行,因为第一行与^%{LOGLEVEL}
匹配。其他行将被忽略,模式将不会继续匹配并将同一行连接起来。因此,你最终会得到一堆部分日志事件。
您需要使用
codec => multiline {
pattern => "^%{LOGLEVEL}"
negate => "true"
what => "previous"
}
代替。这告诉logstash将任何与^%{LOGLEVEL}
不匹配的行加入到上一行。这可以确保事件始终以^%{LOGLEVEL}
匹配行开头,并且是您想要的。