json - 如何将logstash logback encoder 的一些方法封装到一个内部字段中?

标签 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
  }
}

正如您所看到的,一组选择的字段被包裹在“数据”中,而不是稍后放在外部。

最佳答案

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

配置 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每个提供程序的各种配置选项。

关于json - 如何将logstash logback encoder 的一些方法封装到一个内部字段中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57104502/

相关文章:

spring-boot - Spring Boot日志记录如何设置logging.file.max-size无限制

java - 是否可以覆盖 Glassfish v3 的默认日志记录?

asp.net - DataMember 发出默认值

java - 将 JSON 从 Elasticsearch 转换为 Java 对象

javascript - 使用变量时 AngularJS 未定义

elasticsearch - 如何使Logstash替换旧数据?

java - 以编程方式设置 Logback Appender 路径

json - 如何接收 JSON 字符串?

java - 无法定位 logstash 的 java 安装错误

ruby - ruby 代码Logstash中的功能