Logback.groovy LogstashEncoder更改字段名

Logback.groovy LogstashEncoder更改字段名,groovy,logstash,logstash-logback-encoder,Groovy,Logstash,Logstash Logback Encoder,我有一个logback.groovy,它通过一些自定义字段将数据发送到网络上的日志存储: appender("LOGSTASH", LogstashTcpSocketAppender) { encoder(LogstashEncoder) { customFields = """{ "token": "xxxxx", "environment":"dev", "some_property":"foobar" }""" } remoteHost = "logstashliste

我有一个logback.groovy,它通过一些自定义字段将数据发送到网络上的日志存储:

appender("LOGSTASH", LogstashTcpSocketAppender) {
  encoder(LogstashEncoder) {
    customFields = """{ "token": "xxxxx", "environment":"dev", "some_property":"foobar" }"""
  }
  remoteHost = "logstashlistener.host.name"
  port = 5000
}
到目前为止还不错。但是,我需要清理一些对elasticsearch下游无效的字段名。 根据LogstashEncoder文档,可以这样实现:

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

时间
味精
...
这似乎很好,但我必须将其放入logback.groovy符号中。
我尝试使用hashmap、字符串等,但最终总是使用
无法将类为“xxxx”的对象“xxxx”强制转换为类“net.logstash.logback.fieldnames.LogstashFieldNames”
尝试以下操作。您可能还需要为
字段名
生命周期

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


我不得不做类似的事情,尽管我使用的是
LoggingEventCompositeJsonEncoder
编码器

我必须使用的方法是通过logstash logback编码器代码挖掘出真正涉及的类。谢天谢地,IntelliJ的反编译器使这一点不太痛苦

如果您查看LogstashEncoder,它有一个方法
public void setFieldNames(LogstashFieldNames fieldNames)
——因此您需要的是LogstashFieldNames的实例

LogstashFieldNames依次具有
setTimestamp
和其他设置器,因此在groovy中,您的语法应该是:

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

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


有趣的答案。可悲的是,它并没有真正起作用。字段名本身不存在。我把它转换成LogStashFieldName并改编了。。。(这会导致编译错误),但它抱怨无法设置该类的timestamp属性。
import net.logstash.logback.fieldnames.LogstashFieldNames

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