在我的应用程序中运行了数十万行代码,我看到人们正在记录每个日志语句的唯一ID(比如请求ID)。鉴于多线程性质和多个请求即将发布,我确实看到为什么在开始时记录此请求ID一次不起作用。由于其他请求可能介于两者之间,因此日志会混淆。
使用log4j2是否有更简洁的方法。
答案 0 :(得分:1)
这是一个常见问题,在Log4j2中,您可以使用ThreadContext地图来解决它。
当请求输入您的代码时,请在ThreadContext中设置唯一ID:
ThreadContext.put("id", uniqueID());
从此开始,在同一个线程中发生的所有日志记录都将包含一个带有" id"作为键和您指定的值。您可以将其用于filtering,routing,然后您可以使用%X
会话模式将地图显示在日志文件中。如果您只想要特定密钥(例如" id"),请在pattern layout中使用%X{id}
。
完成后,请使用ThreadContext.remove("id")
删除密钥。
最近Log4j2添加了CloseableThreadContext,当你完成它们时会自动删除键值对。
答案 1 :(得分:0)
查看Mapped Dignostic Context(MDC)。它基本上是ThreadLocal,它被附加到同一个线程记录的所有消息中。您必须将其包含在模式中。另外不要忘记清除MDC。
在网络应用程序中,它通常由过滤器完成。