在quarkus vertx reactive中记录id



如何在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附加到每个日志中。

相关内容

  • 没有找到相关文章

最新更新