#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