Logstash:多行 XML 日志的自定义分隔符
Logstash: Custom delimiter for multi-line XML logs
我有 XML 个日志,其中日志以“=======”结束,例如
<log>
<level>DEBUG</level>
<message>This is debug level</message>
</log>
=======
<log>
<level>ERROR</level>
<message>This is error level</message>
</log>
=======
每个日志可以跨越多行。
如何使用 logstash 解析这些日志?
这可以使用多行编解码器来完成。分隔符“=======”可以像这样在模式中使用
input {
file {
type => "xml"
path => "/path/to/logs/*.log"
codec => multiline {
pattern => "^======="
negate => "true"
what => "previous"
}
}
}
filter {
mutate {
gsub => [ "message", "=======", ""]
}
xml {
force_array => false
source => "message"
target => "log"
}
mutate {
remove_field => [ "message" ]
}
}
output {
elasticsearch {
codec => json
hosts => ["http://localhost:9200"]
index => "logs-%{+YYYY.MM.dd}"
}
}
此处 pattern
和 negate => true
的组合表示:如果某行 不是 以“=======”开头,则它属于到上一个事件(因此 what => "previous"
)。当命中带有分隔符的行时,我们开始一个新事件。在过滤器中,使用 gsub
简单地删除分隔符,使用 xml 插件解析 XML。
我有 XML 个日志,其中日志以“=======”结束,例如
<log>
<level>DEBUG</level>
<message>This is debug level</message>
</log>
=======
<log>
<level>ERROR</level>
<message>This is error level</message>
</log>
=======
每个日志可以跨越多行。
如何使用 logstash 解析这些日志?
这可以使用多行编解码器来完成。分隔符“=======”可以像这样在模式中使用
input {
file {
type => "xml"
path => "/path/to/logs/*.log"
codec => multiline {
pattern => "^======="
negate => "true"
what => "previous"
}
}
}
filter {
mutate {
gsub => [ "message", "=======", ""]
}
xml {
force_array => false
source => "message"
target => "log"
}
mutate {
remove_field => [ "message" ]
}
}
output {
elasticsearch {
codec => json
hosts => ["http://localhost:9200"]
index => "logs-%{+YYYY.MM.dd}"
}
}
此处 pattern
和 negate => true
的组合表示:如果某行 不是 以“=======”开头,则它属于到上一个事件(因此 what => "previous"
)。当命中带有分隔符的行时,我们开始一个新事件。在过滤器中,使用 gsub
简单地删除分隔符,使用 xml 插件解析 XML。