如何在quarkus-vertx-reflective中使用id进行日志记录?我想在日志中查看从请求到具有相同id的响应的处理步骤。尽管每个组件都是不同的线程。
恐怕没有内置的请求ID概念,您必须自己生成ID。一种解决方案可以是使用AtomicLong
实例为每个请求生成一个请求ID。
然后,要存储和访问ID,基本上有两个选项。
第一个选项:您可以通过将该ID存储在请求的上下文中
@Inject
CurrentVertxRequest request;
(...)
request.getCurrent().put("requestId", id);
然后产生日志的各种组件可以通过访问ID
request.getCurrent().get("requestId");
并将其添加到日志消息中。
第二个选项:如果您想避免在每个日志消息中手动附加ID的麻烦,可以将其添加到映射诊断上下文(MDC(中。这样做的问题是MDC上下文默认情况下不会传播,因此为了确保每个线程都能看到ID,您需要一个自定义的ThreadContextProvider
,如下所示:
public class MdcContextProvider implements ThreadContextProvider {
@Override
public ThreadContextSnapshot currentContext(Map<String, String> props) {
Map<String, String> propagate = MDC.getCopyOfContextMap();
return () -> {
Map<String, String> old = MDC.getCopyOfContextMap();
MDC.setContextMap(propagate);
return () -> {
MDC.setContextMap(old);
};
};
}
@Override
public ThreadContextSnapshot clearedContext(Map<String, String> props) {
return () -> {
Map<String, String> old = MDC.getCopyOfContextMap();
MDC.clear();
return () -> {
MDC.setContextMap(old);
};
};
}
@Override
public String getThreadContextType() {
return "MDC";
}
}
并添加包含该类的限定名称的CCD_ 3文件。然后,使用将请求ID存储在MDC中
MDC.put("rid", requestId);
并更改日志的格式字符串(例如,quarkus.log.console.format
属性(以包含对它的引用,即%X{rid}
,以确保将该值添加到每个日志中。使用此选项,您可能还应该确保在请求处理完成时清除MDC条目。因此,不幸的是,这个选项要复杂得多,但可能有助于保持代码的整洁,因为您不必将ID附加到每个日志中。