Logback.groovy LogstashEncoder, изменяющий имена полей

У меня есть 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'


person Eric Darchis    schedule 15.04.2016    source источник


Ответы (3)


Попробуйте следующее. Вам также может понадобиться добавить импорт для 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

person Val    schedule 25.04.2016
comment
Интересный ответ. К сожалению, на самом деле это не работает. FieldNames не существует как таковой. Я преобразовал это в LogstashFieldNames и адаптировал ... (что дает ошибку компиляции), но он жалуется, что не может установить свойство метки времени этого класса. - person Eric Darchis; 25.04.2016

Мне пришлось сделать что-то подобное, хотя я использовал кодировщик LoggingEventCompositeJsonEncoder.

Подход, который мне пришлось использовать, заключается в том, чтобы копаться в коде logstash-logback-encoder, чтобы определить, какие классы задействованы. К счастью, декомпилятор IntelliJ делает это не слишком болезненным.

Если вы посмотрите на LogstashEncoder, у него есть метод public void setFieldNames(LogstashFieldNames fieldNames), поэтому вам нужен экземпляр LogstashFieldNames.

LogstashFieldNames, в свою очередь, имеет сеттеры для setTimestamp и остальных, поэтому в groovy ваш синтаксис должен быть:

    encoder(LogstashEncoder) {
        fieldNames(LogstashFieldNames) {
            timestamp = "time"
            message = "msg"
        }
    }
person Korny    schedule 26.08.2016

Это отлично работает для меня. В этом примере атрибут 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")
     }
}
person Henrik Eriksson    schedule 27.05.2021