Logback:如何产生有效的json文件

时间:2019-02-08 18:41:17

标签: java json logstash logback

我的任务是尝试实现一种结构化的方式来记录工作中的事物。我在logback和log4j2之间来回尝试,以满足我对日志记录的某些要求。我决定使用logback,因为它更易于传递键值映射并将其以json格式显示为日志的一部分。但是,与log4j2不同,我无法通过logback将输出打印到格式正确的json文件中。

我尝试了两个使用不同依赖项的附加程序来实现我的目标:JacksonJsonFormatter和Logstash LoggingEventCompositeJsonLayout。我还尝试谷歌搜索我的问题,然后单击前两个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"
  }
]

实际记录数:

{ "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中读取该文件时无法对其进行自动格式化。

有人能解决这个问题吗?

0 个答案:

没有答案