Logstash StructuredArguments kv печатает переменную ZonedDateTime в формате метки времени

#spring-boot #logstash #spring-logback #logstash-logback-encoder

#spring-boot #logstash #spring-logback #logstash-logback-logback-encoder

Вопрос:

Я использую метод logstash KV для ведения журнала. В этом случае у меня есть ключ в виде строки и значение в виде объекта. В журналах объект печатается как JSON, что правильно. Но некоторые переменные в объекте JSON, которые изначально являются ZonedDateTime, печатаются в журналах как временные метки.

Например, одна из переменных печатается в журнале как:

 "createEventDateTime":1540849347.000000000  --> actual

"createEventDateTime":"2018-10-29T21:42:27Z"  --> Expected
 

Ответ №1:

По умолчанию Джексон записывает ZonedDateTime значения полей в виде числового значения.

Чтобы настроить Jackson для записи их в виде строки, совместимой с ISO-8601, отключите функцию WRITE_DATES_AS_TIMESTAMPS сериализации с помощью a JsonFactoryDecorator

 import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.databind.MappingJsonFactory;
import com.fasterxml.jackson.databind.SerializationFeature;
import net.logstash.logback.decorate.JsonFactoryDecorator;

public class TimestampJsonFactoryDecorator implements JsonFactoryDecorator {

    public JsonFactory decorate(JsonFactory factory) {
        ((MappingJsonFactory) factory).getCodec()
                .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        return factory;
    }
}
 

Затем настройте кодировщик для использования этого декоратора…

     <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        <jsonFactoryDecorator class="your.TimestampJsonFactoryDecorator"/>
    </encoder>

 

См. Также Настройка фабрики и генератора JSON