首页 > 解决方案 > Logstash:多行 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解析这些日志?

标签: logstashlogstash-configuration

解决方案


这可以使用多行编解码器来完成。分隔符“=======”可以在这样的模式中使用

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。


推荐阅读