java - Logback:通过 <nestedField> 进行双重嵌套字段

标签 java spring-boot logback

我有一个在 Spring Boot 2 和 JDK 11 上运行的 Java Web 服务,它通过公共(public)库中的模板文件使用 Logback。我正在使用<nestedField>标记以将一些默认 Logback 属性放置在符合 Elastic Common Schema 的位置以及由我的组织标准指定的位置。不幸的是,我未能成功地将属性嵌套在生成的 JSON 中的多个级别上。请允许我举例说明。

公共(public)库中的模板文件如下所示:

    <included>
        <appender name="MACHINE" class="ch.qos.logback.core.ConsoleAppender">

            <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
                <providers>
                    <timestamp/>
                    <nestedField>
                        <fieldName>log</fieldName>
                        <providers>
                            <loggerName>
                                <fieldName>logger</fieldName>
                            </loggerName>
                            <logLevel>
                                <fieldName>level</fieldName>
                            </logLevel>
                        </providers>
                    </nestedField>

                    <message/>

                    <pattern>
                        <omitEmptyFields>true</omitEmptyFields>
                        <pattern>
                            <!--@formatter:off-->
                            {
                                "lots-of-other-MDC-fields-here": {...}
                            }
                            <!--@formatter:on-->
                        </pattern>
                    </pattern>

                </providers>
            </encoder>
        </appender>
    </included>

生成的 JSON 类似于:

    {
      "log": {
        "logger": "...",
        "level: "INFO"
      },
      "message": "...",
      "lots-of-other-MDC-fields-here": {...}
    }

但是,并非所有字段都只嵌套一层。在最外面<providers>上面的标签我想添加以下内容:

    <nestedField>
        <fieldName>extra</fieldName>
        <providers>
            <nestedField>
            <fieldName>keywords</fieldName>
                <stackHash>
                    <fieldName>stack_hash</fieldName>
                    <exclusions>${STE_EXCLUSIONS}</exclusions>
                </stackHash>
            </nestedField>
        </providers>
    </nestedField>

这应该呈现为:

    {
      "log": {
        "logger": "...",
        "level: "INFO"
      },
      "extra": {
        "keywords": {
          "stack_hash": "something here"
        }
      },
      "message": "...",
      "lots-of-other-MDC-fields-here": {...}
    }

不幸的是,当我嵌套时,我没有做正确的事情 <nestedField>下一个 <nestedField>我没有找到任何适用的文档或示例来说明如何正确完成此操作。我正在寻找有关如何获取示例中提供的配置以呈现为上述输出的清晰示例。

上面例子的实际输出是:

Exception in thread "main" java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.joran.spi.Interpreter@67:40 - no applicable action for [stackHash], current ElementPath  is [[configuration][appender][encoder][providers][nestedField][providers][nestedField][stackHash]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@69:45 - no applicable action for [exclusions], current ElementPath  is [[configuration][appender][encoder][providers][nestedField][providers][nestedField][stackHash][exclusions]]

对于上下文,以下是我的服务如何使用已部署的模板:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProfile name="deployed-mode">
        <include resource="com/.../logging/logback/my-logback-template.xml"/>
        <root level="INFO">
            <appender-ref ref="MACHINE"/>
        </root>
    </springProfile>
</configuration>

最佳答案

显然上面的格式是有效的,logstash 编码器中一定存在错误。我无法确定该错误在哪里,因为它自行解决了。目前使用logstash编码器6.2。如果有人更准确地知道如何修复此错误,我会接受该答案。

关于java - Logback:通过 <nestedField> 进行双重嵌套字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60122441/

相关文章:

spring-boot - Spring Security中AuthenticationManager和AuthenticationProvider Authenticate方法的区别

java - 如何编写一个接受字符串数组并打印每个字符串的方法?

java - 另一个目录问题(Java)

java - 我在 MongoDB 中存储了一个带有 UNIX 时间戳的 JAVA 日期并得到了错误的答案

java - Spring Boot - 从 application.properties 读取文件、路径

maven - 通过将其添加为测试范围来排除 Maven 依赖项?

java - 如何仅在需要时显示框架并设置框架始终显示在顶部?

spring-boot - Vaadin 8 - 小部件集

Java sl4j-log4j 日志记录库无法正常工作

java - 如何启用日志返回日志堆栈跟踪和未捕获的异常