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:
添加日志记录适配器库,以确保通过这些 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")
- 验证添加的库生成的日志是否遵循与其他 Quarkus 日志的格式相同。
1.11.2. 使用 MDC 添加上下文日志信息
Quarkus 会覆盖日志记录映射的 diagnostics Context (MDC),以改进与其被动内核的兼容性。
1.11.2.1. 添加和读取 MDC 数据
要在 MDC 中添加数据,并将其提取到日志输出中:
使用
MDC
类设置数据。-
添加
导入 org.jboss.logmanager.MDC;
设置
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!"; } }
-
添加
将日志格式配置为使用
%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 数据存储在 重复的上下文中,后者是处理单个任务或请求的隔离上下文。