2

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

4

1 回答 1

2

你没有提到你实际上是如何进行日志记录的: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");
    }
}

这样,您将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

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

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

于 2021-08-24T11:42:15.000 回答