多线程日志记录的简单方法
Easy way for multi-threading logging
我正在开发一个使用 forkjoinpool 进行多线程处理并使用 log4j 进行日志记录的项目。在我们的项目中有多个'jobs' 运行并发,每个作业只由一个线程处理。
日志记录的问题出在作业的主要流程中,我们可以将作业 ID 作为前缀添加到记录器中,以便相应的日志条目将具有作业 ID 信息。然而,在处理每个作业的过程中,有很多实用程序 API 被调用,来自这些 API 的日志条目没有作业信息。 log4j 确实会打印线程 ID,因此这是一种区分不同作业日志的方法,但我想知道将作业 ID 添加到实用程序 API 日志的 easiest/best 方法是什么?
我大致有两个想法,我不确定我的方向是否正确,
- 如果我有办法用我的作业 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");
}
}
我正在开发一个使用 forkjoinpool 进行多线程处理并使用 log4j 进行日志记录的项目。在我们的项目中有多个'jobs' 运行并发,每个作业只由一个线程处理。
日志记录的问题出在作业的主要流程中,我们可以将作业 ID 作为前缀添加到记录器中,以便相应的日志条目将具有作业 ID 信息。然而,在处理每个作业的过程中,有很多实用程序 API 被调用,来自这些 API 的日志条目没有作业信息。 log4j 确实会打印线程 ID,因此这是一种区分不同作业日志的方法,但我想知道将作业 ID 添加到实用程序 API 日志的 easiest/best 方法是什么?
我大致有两个想法,我不确定我的方向是否正确,
- 如果我有办法用我的作业 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");
}
}