我正在开发一个项目,该项目使用 forkjoinpool 进行多线程处理,使用 log4j 进行日志记录。在我们的项目中,有多个“作业”并发运行,每个作业仅由一个线程处理。
日志记录的问题在于作业的主要流程中,我们可以将作业 ID 作为记录器的前缀,以便相应的日志条目将具有作业 ID 信息。然而,在每个作业的处理过程中,都会调用许多实用程序 API,并且来自此类 API 的日志条目没有作业信息。 log4j 确实打印线程 ID,因此这是区分不同作业日志的一种方法,但我想知道将作业 ID 添加到实用程序 API 日志的最简单/最佳方法是什么?
我大约有两个想法,我不确定我的方向是否正确,
- 如果有办法让我用我的作业 ID 替换线程名称,那么我认为我可以使用 log4j 的默认线程前缀。
- 或者我应该创建实用程序方法将记录器作为输入,以便该记录器可以打印作业信息?
请指教,谢谢。
最佳答案
对于这样的事情,mapped diagnostic context是跟踪您的工作 ID 的好方法。您可以在每个线程的基础上设置它(并在 finally
子句中删除它),并且可以像模式布局中的线程名称一样引用它。
@Override
protected void compute() {
MDC.put("job-id", jobId);
try {
/* Do your task */
} finally {
MDC.remove("job-id");
}
}
关于java - 多线程日志记录的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33837910/