如何将Logstash Logback编码器的某些方法包装到内部字段中?

时间:2019-07-19 01:37:05

标签: json logstash logback spring-logback logstash-logback-encoder

我希望能够将logstash logback编码器生成的某些字段包装在另一个字段中。可以通过logback-spring.xml内部的XML配置完成此操作,还是必须实现一些类,然后在配置中引用它?

我尝试阅读有关实现Factory和Decorator方法的内容,但似乎无济于事。

<appender name="FILE"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/Users/name/dev/test.log
    </file>
    <rollingPolicy
        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- daily rollover -->
        <fileNamePattern>/Users/name/dev/log/test.%d{yyyy-MM-dd}.log
        </fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        <customFields>{"component":"webserver","datacenter":"ord"}
        </customFields>

    </encoder>
</appender>

当有日志记录时,我得到的当前JSON是:

{
  "@timestamp": "2019-07-18T18:12:49.431-07:00",
  "@version": "1",
  "message": "Application shutdown requested.",
  "logger_name":     "org.springframework.boot.admin.SpringApplicationAdminMXBeanRegistrar$SpringApplicationAdmin",
  "thread_name": "RMI TCP Connection(2)-127.0.0.1",
  "level": "INFO",
  "level_value": 20000,
  "component": "webserver",
  "datacenter": "ord"
}

我想要的是:

{
  "@timestamp": "2019-07-18T18:12:49.431-07:00",
  "@version": "1",
  "component": "webserver",
  "datacenter": "ord",
  "data": {
    "message": "Application shutdown requested.",
    "logger_name": "org.springframework.boot.admin.SpringApplicationAdminMXBeanRegistrar$SpringApplicationAdmin",
    "thread_name": "RMI TCP Connection(2)-127.0.0.1",
    "level": "INFO",
    "level_value": 20000
  }
}

如您所见,一组选定的字段用'数据'包裹,而不是稍后在外面。

1 个答案:

答案 0 :(得分:1)

您需要使用net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder并配置其net.logstash.logback.encoder.LogstashEncoder集,而不是使用providers。使用nestedField提供程序来创建嵌套的data字段。

配置LoggingEventCompositeJsonEncoder比配置LogstashEncoder更为复杂,因为LoggingEventCompositeJsonEncoder开始时未配置任何提供程序,因此您必须使用所需的所有提供程序进行构建。 LogstashEncoder只是LoggingEventCompositeJsonEncoder的子类,具有一组预先配置的提供程序。

<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
  <providers>
    <timestamp/>
    <version/>
    <pattern>
      <pattern>
        {
          "component": "webserver",
          "datacenter":"ord"
        }
      </pattern>
    </pattern>
    <nestedField>
      <fieldName>data</fieldName>
      <providers>
        <message/>
        <loggerName/>
        <threadName/>
        <logLevel/>
        <callerData/>
        <stackTrace/>
        <context/>
        <mdc/>
        <tags/>
        <logstashMarkers/>
        <arguments/>
      </providers>
    </nestedField>
  </providers>
</encoder>

请务必检查provider configuration documentation中每个提供商的各种配置选项。