如何从多线程log4j2缓冲区读取

时间:2018-09-07 07:14:26

标签: java multithreading junit4 log4j2 maven-surefire-plugin

我已经执行了由maven-surefire-plugin管理的多线程自动测试用例。每个类都有自己的线程在其中执行,并且 log4j2 bufferIO = trueimmediateFlush= true配置。在输出文件中,所有线程都在混合信息。我知道 log4j2 具有此缓冲区,并且我想知道每个线程是否都有自己的缓冲区,以及在将信息写入输出文件之前是否可以从中读取。

我阅读了本主题的其他question related,但尚未找到解决方案。因此,我正在尝试寻找另一条路径。

1 个答案:

答案 0 :(得分:1)

我发现的第一件事是,当我们以多线程方式执行测试用例时,JUnit5是混合输出日志文件的原因。当我使用JUnit4作为默认输出时,通常控制台会等待测试用例写完。

另一方面,log4j的输出文件在用户执行多任务处理时,始终显示混合了所有线程,而与JUnit版本无关。

我将线程ID添加到log4j布局模式: %d{yyyy-MM-dd HH:mm:ss} %-5p- **[%tid]** %m%n

在完成每个线程后,我读取了输出log4j文件的最后几行,并按线程ID号进行过滤以获得相关行。至此,我不得不解决其他问题。如何获取动态log4j输出日志文件的绝对路径?我测试了两种解决方案:

  1. 通过反射(不推荐,但是更快)
  2. 实施您自己的FileAppender,以创建访问fileName字段的方法

遵循第一个选项的两个步骤是:

LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Appender appender = ctx.getConfiguration().getAppenders().get("file");

appender变量具有fileName字段,但它是私有的。