java - 多线程日志记录的简单方法

标签 java multithreading logging log4j forkjoinpool

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

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

我大约有两个想法,我不确定我的方向是否正确,

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

请指教,谢谢。

最佳答案

对于这样的事情,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/

相关文章:

java - 分组编辑文本

Java Do-While 循环

java - 为什么 split 函数在 java 中表现得像这样?

c# - 如何并行和串行处理集合中的项目

linux - 如何在 linux 中创建虚拟设备?

mysql慢查询日志

javascript - GWT java.util.Date 序列化

java - ExecutorService 的 newFixedThreadPool() 为什么我们需要固定数量的 Activity 线程?

c - 线程程序从线程返回错误(?)结果

java - 创建一个日志程序来记录输入