Quarkus 日志记录事务 ID

Cod*_*ode 4 jboss-logging quarkus

我的应用程序有几个JAX-RSAPI,它们都将交易 id 作为标头,我们有什么方法可以访问交易 id 吗Jboss Logger?我们尝试过MDC,但这没有帮助。基本上我正在寻找将事务 ID 添加到每个日志中的有效方法。

ynt*_*ual 7

您没有提到实际如何进行日志记录:log.代码中的显式语句,或一些 CDI/JAXRS 拦截器...

实现所需功能的常见方法是在边界层(在您的情况下为 JAX-RS)上定义一个过滤器/拦截器,它提取相关的请求数据并将其存储在执行该请求期间记录器可用的上下文中。这正是 JAX-RS 过滤器和 MDC 的用途。

一个简单的例子:

@Provider
public class TransactionLoggingFilter implements ContainerRequestFilter, ContainerResponseFilter {

    @Context
    HttpServerRequest request;

    @Override
    public void filter(ContainerRequestContext context) {
        MDC.put("transactionId", request.getHeader("transactionId"));
    }

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        MDC.remove("transactionId");
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您将transactionId在处理每个 HTTP 请求之前将标头的值存储在 MDC 范围中,并在处理完成后将其删除。

注意:如果您有其他 JAX-RS 过滤器,您可能需要正确配置优先级(例如,以便您的日志记录提取过滤器在其他过滤器之前运行)请参阅文档

MDC 范围绑定到执行请求的线程(如果您使用 Quarkus 反应式,请小心,确保它正确传播),并将在每次日志调用时传递到记录器 impl。

要实际在日志中打印 MDC 的值,您需要通过以下方式修改 Quarkus 日志格​​式:

quarkus.log.console.format=%d{HH:mm:ss} %-5p %X{transactionId} [%c{2.}] (%t) %s%e%n
Run Code Online (Sandbox Code Playgroud)

您可以使用 expression 访问任何 MDC 范围变量%X{var_name}

有关更多信息,请参阅有关日志记录的 Quarkus 文档。