Logback: как создать действительный файл json - PullRequest
0 голосов
/ 08 февраля 2019

Мне поручено попытаться реализовать структурированный способ регистрации вещей на работе.Я ходил туда-сюда между 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.

Кто-нибудь получил решение этой проблемы?

...