8

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

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 符号中。我尝试了哈希图、字符串等,但总是以Cannot cast object 'xxxx' with class 'xxxx' to class 'net.logstash.logback.fieldnames.LogstashFieldNames'

4

3 回答 3

2

试试下面的。您可能还需要为FieldNames和添加一些导入LifeCycle

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

于 2016-04-25T05:18:40.283 回答
1

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

我不得不使用的方法是挖掘 logstash-logback-encoder 代码以计算出所涉及的真实类。谢天谢地,IntelliJ 的反编译器使这不会太痛苦。

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

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

    encoder(LogstashEncoder) {
        fieldNames(LogstashFieldNames) {
            timestamp = "time"
            message = "msg"
        }
    }
于 2016-08-26T08:42:54.727 回答
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")
     }
}
于 2021-05-27T06:31:01.043 回答