1.11. 使用其他日志记录 API


红帽构建的 Quarkus 依赖于 JBoss Logging 库来满足所有日志记录要求。

假设您使用依赖于其他日志记录库的库,如 Apache Commons Logging、Log4j 或 SLF4J。在这种情况下,将它们从依赖项中排除,并使用其中一个 JBoss Logging 适配器。

这在构建原生可执行文件时尤为重要,因为您可能会在编译原生可执行文件时遇到类似如下的问题:

Caused by java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl

日志记录实现不包括在原生可执行文件中,但您可以使用 JBoss Logging 适配器解决这个问题。

这些适配器可用于流行的开源日志记录组件,如下一章节中所述。

1.11.1. 在应用程序中添加日志适配器

对于每个不是 jboss-logging 的日志记录 API:

  1. 添加日志记录适配器库,以确保通过这些 API 记录的消息路由到 JBoss Log Manager 后端。

    注意

    对于是 Quarkus 扩展依赖项的库,这个库不需要自动处理它。

    • Apache Commons Logging:

      • 使用 Maven:

        <dependency>
            <groupId>org.jboss.logging</groupId>
            <artifactId>commons-logging-jboss-logging</artifactId>
        </dependency>
      • 使用 Gradle:

        implementation("org.jboss.logging:commons-logging-jboss-logging")
    • Log4j:

      • 使用 Maven:

        <dependency>
            <groupId>org.jboss.logmanager</groupId>
            <artifactId>log4j-jboss-logmanager</artifactId>
        </dependency>
      • 使用 Gradle:

        implementation("org.jboss.logmanager:log4j-jboss-logmanager")
    • Log4j 2:

      • 使用 Maven:

        <dependency>
            <groupId>org.jboss.logmanager</groupId>
            <artifactId>log4j2-jboss-logmanager</artifactId>
        </dependency>
      • 使用 Gradle:

        implementation("org.jboss.logmanager:log4j2-jboss-logmanager")
        注意

        不要包含任何 Log4j 依赖项,因为 log4j2-jboss-logmanager 库包含使用 Log4j 作为日志实施所需的所有内容。

    • SLF4J:

      • 使用 Maven:

        <dependency>
            <groupId>org.jboss.slf4j</groupId>
            <artifactId>slf4j-jboss-logmanager</artifactId>
        </dependency>
      • 使用 Gradle:

        implementation("org.jboss.slf4j:slf4j-jboss-logmanager")
  2. 验证添加的库生成的日志是否遵循与其他 Quarkus 日志的格式相同。

1.11.2. 使用 MDC 添加上下文日志信息

Quarkus 会覆盖日志记录映射的 diagnostics Context (MDC),以改进与其被动内核的兼容性。

1.11.2.1. 添加和读取 MDC 数据

要在 MDC 中添加数据,并将其提取到日志输出中:

  1. 使用 MDC 类设置数据。

    1. 添加 导入 org.jboss.logmanager.MDC;
    2. 设置 MDC.put (…​),如下例所示:

      JBoss Logging 和 io.quarkus.logging.Log的示例

      package me.sample;
      
      import io.quarkus.logging.Log;
      import jakarta.ws.rs.GET;
      import jakarta.ws.rs.Path;
      import org.jboss.logmanager.MDC;
      
      import java.util.UUID;
      
      @Path("/hello/jboss")
      public class GreetingResourceJbossLogging {
      
          @GET
          @Path("/test")
          public String greeting() {
              MDC.put("request.id", UUID.randomUUID().toString());
              MDC.put("request.path", "/hello/test");
              Log.info("request received");
              return "hello world!";
          }
      }

  2. 将日志格式配置为使用 %X{mdc-key}

    quarkus.log.console.format=%d{HH:mm:ss} %-5p request.id=%X{request.id} request.path=%X{request.path} [%c{2.}] (%t) %s%n

    生成的消息包含 MDC 数据:

    08:48:13 INFO request.id=c37a3a36-b7f6-4492-83a1-de41dbc26fe2 request.path=/hello/test [me.sa.GreetingResourceJbossLogging] (executor-thread-1) request received

1.11.2.2. MDC 和支持的日志记录 API

根据您的日志记录 API,使用以下 MDC 类之一:

  • Log4j 1 - org.apache.log4j.MDC.put (key, value)
  • Log4j 2 - org.apache.logging.log4j.ThreadContext.put(key, value)
  • SLF4J - org.slf4j.MDC.put(key, value)

1.11.2.3. MDC 传播

在 Quarkus 中,MDC 供应商具有处理被动上下文的特定实现,确保在被动和异步处理过程中传播 MDC 数据。

因此,您仍可在各种情况下访问 MDC 数据:

  • 异步调用后,例如,当 REST 客户端返回 Uni 时。
  • 在提交到 org.eclipse.microprofile.context.ManagedExecutor 的代码中。
  • 在使用 vertx.executeBlocking () 执行的代码中。
注意

如果适用,MDC 数据存储在 重复的上下文中,后者是处理单个任务或请求的隔离上下文。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.