0

我正在使用 logstash KV 方法进行日志记录。因为我有一个作为字符串的键和作为一个对象的值。在日志中,对象打印为正确的 JSON。但是 JSON 对象中最初是 ZonedDateTime 的一些变量正在日志中作为时间戳打印。

例如,其中一个变量在日志中打印为:

"createEventDateTime":1540849347.000000000  --> actual

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

1 回答 1

2

默认情况下,Jackson 将ZonedDateTime字段值写入为数值。

要将 Jackson 配置为将它们写入 ISO-8601 兼容字符串,请WRITE_DATES_AS_TIMESTAMPS通过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 工厂和生成器

于 2021-02-27T02:11:56.493 回答