Как я могу изменить имя ключа в выводе JSON, используя Logback? - PullRequest
2 голосов
/ 13 января 2020

Вот моя конфигурация входа в систему.

<springProfile name="prod">
    <root level="info">
        <appender name="naki" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>${logging_level}</level> <!-- setup via ENV variable log level -->
            </filter>
            <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
                    <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
                    <timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
                    <appendLineSeparator>true</appendLineSeparator> <!-- don't forget line break -->

                    <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
                        <prettyPrint>false
                        </prettyPrint> <!-- in prod never pretty print, line breaks are considered as separate log entry -->
                    </jsonFormatter>
                </layout>
            </encoder>
        </appender>
    </root>
</springProfile>

<springProfile name="dev">
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <root level="info">
        <appender-ref ref="CONSOLE"/>
    </root>
</springProfile>

Вот вывод, который я получаю:

{"timestamp":"2020-01-13T13:38:38.001Z","level":"INFO","thread":"main","logger":"com.nakipower.identity.api.config.Application","message":"Started Application in 8.605 seconds (JVM running for 9.439)","context":"default"}

Как я могу переименовать JSON level имя ключа для серьезность ? Итак, я получаю "severity":"INFO" вместо "level":"INFO". Могу ли я на самом деле переименовать JSON имена ключей при настройке ведения журнала с logback?

1 Ответ

2 голосов
/ 13 января 2020

Вы можете расширить ch.qos.logback.contrib.jackson.JacksonJsonFormatter и переопределить toJsonString(Map m) метод. Там вы можете заменить запись level на данной карте на новую с ключом severity.

public class CustomJsonFormatter extends JacksonJsonFormatter{

    @Override
    public String toJsonString(Map map) throws IOException {
        map.put("severity", map.get("level"));
        map.remove("level");
        return super.toJsonString(map);
    }
}

. В вашей конфигурации xml в теге jsonFormatter укажите новый форматтер, который вы только что создал

<appender name="naki" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level> <!-- setup via ENV variable log level -->
            </filter>
            <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
                    <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
                    <timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
                    <appendLineSeparator>true</appendLineSeparator> <!-- don't forget line break -->

                    <jsonFormatter class="mypackage.CustomJsonFormatter"> <!-- Here point to your custom json formatter -->
                        <prettyPrint>false
                        </prettyPrint> <!-- in prod never pretty print, line breaks are considered as separate log entry -->
                    </jsonFormatter>
                </layout>
            </encoder>
        </appender>
...