如何将 logstash logback 编码器的一些方法包装到内部字段中?

How do I wrap some of the methods of logstash logback encoder into an inner field?

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

我尝试阅读有关实现 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
  }
}

如您所见,select 组字段被包裹在 'data' 中,而不是稍后被包裹在外部。

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

配置 LoggingEventCompositeJsonEncoder 比配置 LogstashEncoder 更复杂,因为 LoggingEventCompositeJsonEncoder 开始时没有配置提供程序,您必须使用所需的所有提供程序进行构建。 LogstashEncoder 只是 LoggingEventCompositeJsonEncoder 的子类,具有 pre-configured 组提供者。

<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 以了解每个提供商的各种配置选项。