0

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

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

我大概有两个想法,我不确定我是否走对了方向,

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

请指教,谢谢。

4

1 回答 1

1

对于这样的事情,映射的诊断上下文是跟踪您的作业 ID 的好方法。您可以在每个线程的基础上设置它(并在子句中删除它finally),并且可以像模式布局中的线程名称一样引用它。

@Override
protected void compute() {
  MDC.put("job-id", jobId);
  try {
    /* Do your task */
  } finally {
    MDC.remove("job-id");
  }
}
于 2015-11-21T00:06:04.923 回答