Мне поручено попытаться реализовать структурированный способ регистрации вещей на работе.Я ходил туда-сюда между logback и log4j2, чтобы попытаться удовлетворить некоторые требования, предъявляемые к журналу.Я решил использовать logback, поскольку легче передать ему карту значений ключей и отобразить ее в формате json как часть журнала.Однако, в отличие от log4j2, я не могу получить logback для печати вывода в хорошо отформатированный файл json.
Я пробовал два разных приложения, использующих разные зависимости, чтобы попытаться достичь своей цели: JacksonJsonFormatter и logstashLoggingEventCompositeJsonLayout.Я также попытался погуглить мою проблему и щелкнул ссылки на первых двух страницах Google без какого-либо решения, имеющего отношение к моей проблеме.Вот два разных приложения:
Использование Джексона:
<appender name="test" class="ch.qos.logback.core.rolling.RollingFileAppender">
<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>
<jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
<prettyPrint>true</prettyPrint>
</jsonFormatter>
</layout>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<file>./logs/info.log.json</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.json</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
</appender>
Использование logstash:
<appender name="stash" class="ch.qos.logback.core.rolling.RollingFileAppender">
<layout class="net.logstash.logback.layout.LoggingEventCompositeJsonLayout">
<providers>
<message/>
<loggerName/>
<threadName/>
<logLevel/>
<logLevelValue/>
<callerData/>
<stackTrace/>
<stackHash/>
<throwableClassName/>
<context/>
<contextName/>
<mdc/>
</providers>
</layout>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<file>./logs/info.log.json</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.json</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
</appender>
То, что я хотел бы получить в качестве вывода, было бы хорошо сформированоФайл json означает, что если я зарегистрирую 3 события, все будет выглядеть так (я упростил формат для удобства чтения).
Ожидаемый:
[
{
"message": "hello",
"context": "default"
},
{
"message": "hi",
"context": "default"
},
{
"message": "how are you",
"context": "default"
}
]
Фактический logstash:
{ "message": "hello", "context": "default"}{"message": "hi", "context": "default"} {"message": "how are you", "context": "default"}
Фактический Джексон:
{
"message": "hello",
"context": "default"
}{
"message": "hi",
"context": "default"
}{
"message": "how are you",
"context": "default"
}
Обратите внимание, что между зарегистрированными событиями нет запятых, а сами события не являются частью массива.Джексон умеет красиво печатать, вроде как, тогда как тайник журнала помещает все в одну строку.Это означает, что файл недействителен по json и, среди прочего, не может быть автоматически отформатирован при чтении его в моей IDE.
Кто-нибудь получил решение этой проблемы?