logback JSON - печать метки времени журнала в формате времени эпохи (в секундах)

У меня есть следующее в моем logback.xml для входа в JSON. Я хочу напечатать поле log_timestamp ниже в формате времени эпохи (в секундах) вместо даты и времени.

<appender name="JSON_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <pattern>               
                   <pattern>                       
                        {
                          "appNname": "${appName}",
                          "log_timestamp":"%date",
                          "level": "%level",
                          "method":"%M",
                          "class":"%c",
                          "user_id": "%mdc{user_id}"
                        }    
                   </pattern>
            </pattern>
        </providers>
    </encoder>
</appender>

Вопрос связан с вместо этого печатать метку времени эпохи даты и времени

Я попробовал предложение по приведенной выше ссылке, включив следующее непосредственно под кодировщиком. Но это не сработало.

<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
   <layout class="net.logstash.logback.layout.LogstashLayout">    
     <timestampPattern>[UNIX_TIMESTAMP_AS_NUMBER]</timestampPattern>
   </layout>

Я ценю, если кто-то дает мне подсказку для достижения этого.




Ответы (1)


Поскольку слово преобразования %date в logback не поддерживает время эпохи, вам потребуется использовать провайдер timestamp logstash-logback-encoder, чтобы добавить поле метки времени.

<appender name="JSON_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <timestamp>
                <fieldName>log_timestamp</fieldName>
                <pattern>[UNIX_TIMESTAMP_AS_NUMBER]</pattern>
            </timestamp>
            <pattern>               
                   <pattern>                       
                        {
                          "appName": "${appName}",
                          "level": "%level",
                          "method":"%M",
                          "class":"%c",
                          "user_id": "%mdc{user_id}"
                        }    
                   </pattern>
            </pattern>
        </providers>
    </encoder>
</appender>

Обратите внимание, что значение метки времени будет в миллисекундах, а не в секундах.

Если вам нужны секунды, то я думаю, что единственный способ - реализовать пользовательский JsonProvider

person Phil Clay    schedule 09.06.2021
comment
Большое спасибо. Это сработало как шарм! Отметка времени в миллисекундах в порядке. - person Ben; 10.06.2021