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}"
  }
}

此处 patternnegate => true 的组合表示:如果某行 不是 以“=======”开头,则它属于到上一个事件(因此 what => "previous")。当命中带有分隔符的行时,我们开始一个新事件。在过滤器中,使用 gsub 简单地删除分隔符,使用 xml 插件解析 XML。