如何从多线程log4j2缓冲区中读取
How to read from multithreading log4j2 buffer
我用多线程执行了自动化测试用例,由 maven-surefire-plugin
管理。每个 class 都有自己的执行线程,log4j2 配置有 bufferIO = true
和 immediateFlush= true
。在输出文件中,所有线程都在混合信息。我知道 log4j2 有这个缓冲区,我想知道每个线程是否都有自己的缓冲区,以及我是否可以在信息写入输出文件之前从中读取。
我阅读了有关此主题的其他 question related,但尚未找到解决方案。出于这个原因,我正在尝试寻找另一条路径。
我发现的第一件事是JUnit5
是混合输出日志文件的原因,当我们以多线程方式执行测试用例时。当我使用JUnit4
默认输出时,通常控制台会等待测试用例结束写入。
另一方面,来自 log4j
的输出文件,当用户使用多线程执行它时,无论 JUnit 版本如何,它总是显示混合所有线程。
他们,我把线程id加入到log4j布局模式中:
%d{yyyy-MM-dd HH:mm:ss} %-5p- **[%tid]** %m%n
在完成每个线程后,我读取输出 log4j 文件的最后几行,并按线程 ID 号进行过滤以获得相关行。有了这一点,我不得不解决其他问题。如何获取动态log4j输出日志文件的绝对路径?我测试了两种解决方案:
- 通过反射(不推荐,但更快)
- 实现您自己的 FileAppender 以创建访问
fileName
字段的方法
第一个选项的两个步骤是:
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Appender appender = ctx.getConfiguration().getAppenders().get("file");
appender
变量有 fileName 字段,但它是私有的。
我用多线程执行了自动化测试用例,由 maven-surefire-plugin
管理。每个 class 都有自己的执行线程,log4j2 配置有 bufferIO = true
和 immediateFlush= true
。在输出文件中,所有线程都在混合信息。我知道 log4j2 有这个缓冲区,我想知道每个线程是否都有自己的缓冲区,以及我是否可以在信息写入输出文件之前从中读取。
我阅读了有关此主题的其他 question related,但尚未找到解决方案。出于这个原因,我正在尝试寻找另一条路径。
我发现的第一件事是JUnit5
是混合输出日志文件的原因,当我们以多线程方式执行测试用例时。当我使用JUnit4
默认输出时,通常控制台会等待测试用例结束写入。
另一方面,来自 log4j
的输出文件,当用户使用多线程执行它时,无论 JUnit 版本如何,它总是显示混合所有线程。
他们,我把线程id加入到log4j布局模式中:
%d{yyyy-MM-dd HH:mm:ss} %-5p- **[%tid]** %m%n
在完成每个线程后,我读取输出 log4j 文件的最后几行,并按线程 ID 号进行过滤以获得相关行。有了这一点,我不得不解决其他问题。如何获取动态log4j输出日志文件的绝对路径?我测试了两种解决方案:
- 通过反射(不推荐,但更快)
- 实现您自己的 FileAppender 以创建访问
fileName
字段的方法
第一个选项的两个步骤是:
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Appender appender = ctx.getConfiguration().getAppenders().get("file");
appender
变量有 fileName 字段,但它是私有的。