Logback.groovy LogstashEncoder更改字段名称

时间:2016-04-15 13:18:26

标签: groovy logstash logstash-logback-encoder

我有一个logback.groovy,可以使用一些自定义字段将数据发送到网络上的logstash:

appender("LOGSTASH", LogstashTcpSocketAppender) {
  encoder(LogstashEncoder) {
    customFields = """{ "token": "xxxxx", "environment":"dev", "some_property":"foobar" }"""
  }
  remoteHost = "logstashlistener.host.name"
  port = 5000
}

到目前为止一切顺利。但是,我需要清理一些对弹性搜索下游无效的字段名称。 基于LogstashEncoder文档,可以这样实现:

<encoder class="net.logstash.logback.encoder.LogstashEncoder">
  <fieldNames>
    <timestamp>time</timestamp>
    <message>msg</message>
    ...
  </fieldNames>
</encoder>

这看起来很棒,但我必须将其纳入logback.groovy表示法。 我尝试使用hashmap,string等等,但总是以Cannot cast object 'xxxx' with class 'xxxx' to class 'net.logstash.logback.fieldnames.LogstashFieldNames'

结束

3 个答案:

答案 0 :(得分:2)

尝试以下方法。您可能还需要为FieldNamesLifeCycle

添加一些导入
appender("LOGSTASH", LogstashTcpSocketAppender) {
  encoder(LogstashEncoder) {
    customFields = """{ "token": "xxxxx", "environment":"dev", "some_property":"foobar" }"""

    FieldNames... aFieldNames = new FieldNames()
    aFieldNames.timestamp = "time"
    aFieldNames.message = "msg"
    if(aFieldNames instanceof LifeCycle)
      aFieldNames.start()
    fieldNames = aFieldNames
  }
  remoteHost = "logstashlistener.host.name"
  port = 5000
}

您可以使用Logback网站上的以下帮助页面将XML配置转换为Groovy。

http://logback.qos.ch/translator/asGroovy.html

答案 1 :(得分:1)

我必须做类似的事情,尽管我使用的是LoggingEventCompositeJsonEncoder编码器。

我必须使用的方法是挖掘logstash-logback-encoder代码以找出所涉及的真实类。值得庆幸的是,IntelliJ的反编译器使这不太痛苦。

如果你看一下LogstashEncoder,它有一个方法public void setFieldNames(LogstashFieldNames fieldNames) - 所以你需要的是一个LogstashFieldNames实例

LogstashFieldNames又有setTimestamp和其他的设置器,所以在groovy中你的语法应该是:

    encoder(LogstashEncoder) {
        fieldNames(LogstashFieldNames) {
            timestamp = "time"
            message = "msg"
        }
    }

答案 2 :(得分:0)

这对我来说很好用。本示例将属性“logger_name”重命名为“loggerName”

import net.logstash.logback.fieldnames.LogstashFieldNames

appender('STDOUT', ConsoleAppender) {   
     encoder(net.logstash.logback.encoder.LogstashEncoder) {
          
            // Rename standard fields
            fieldNames = new LogstashFieldNames(logger:"loggerName")
     }
}