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

问题描述 投票:2回答:1

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

我读了其他question related这个主题,但它还没有找到解决方案。因此,我正试图寻找另一条路。

java multithreading junit4 log4j2 maven-surefire-plugin
1个回答
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");

appendervariable具有fileName字段,但它是私有的。

© www.soinside.com 2019 - 2024. All rights reserved.