多线程记录的简便方法

时间:2015-11-20 23:45:10

标签: java multithreading logging log4j forkjoinpool

我正在开发一个项目,该项目使用forkjoinpool进行多线程,使用log4j进行日志记录。在我们的项目中,有多个工作岗位。并发运行,每个作业只由一个线程处理。

日志记录的问题在作业的主要流程中,我们可以将作业ID添加到记录器前面,以便相应的日志条目具有作业ID信息。但是,在处理每个作业时,会调用许多实用程序API,并且来自此类API的日志记录条目不具有作业信息。 log4j确实打印了线程ID,以便区分不同作业的日志,但我想知道将作业ID添加到实用程序API日志的最简单/最好的方法是什么?

我有两个想法,我不确定我是否朝着正确的方向前进,

  1. 如果我有办法用我的工作ID替换线程名称,那么我认为我对log4j的默认线程前缀很好。
  2. 或者我应该使用实用程序方法将记录器作为输入,以便该记录器可以打印作业信息吗?
  3. 请指教,谢谢。

1 个答案:

答案 0 :(得分:1)

对于类似的内容,mapped diagnostic context是跟踪您的工作ID的好方法。您可以在每个线程的基础上设置它(并在finally子句中将其删除),并且您可以像模式布局中的线程名称一样引用它。

@Override
protected void compute() {
  MDC.put("job-id", jobId);
  try {
    /* Do your task */
  } finally {
    MDC.remove("job-id");
  }
}