Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何读取多线程log4j2缓冲区_Java_Multithreading_Junit4_Log4j2_Maven Surefire Plugin - Fatal编程技术网

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

Java 如何读取多线程log4j2缓冲区,java,multithreading,junit4,log4j2,maven-surefire-plugin,Java,Multithreading,Junit4,Log4j2,Maven Surefire Plugin,我已经用多线程执行了自动化测试用例,由maven-surefire-plugin管理。每个类在执行时都有自己的线程,log4j2配置为bufferIO=true和immediateFlush=true。在输出文件中,所有线程都在混合信息。我知道log4j2有这个缓冲区,我想知道每个线程是否有自己的缓冲区,以及在将信息写入输出文件之前是否可以从中读取 我读了其他关于这个话题的文章,但还没有找到解决办法。出于这个原因,我试图搜索另一条路径。我发现的第一件事是,当我们以多线程方式执行测试用例时,JUn

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


我读了其他关于这个话题的文章,但还没有找到解决办法。出于这个原因,我试图搜索另一条路径。

我发现的第一件事是,当我们以多线程方式执行测试用例时,
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字段,但它是私有的。

    您想实现什么?为什么要从内部日志缓冲区读取?因为输出日志是混合的。我想分别获取每个线程的日志,以获取每个测试用例的输出,以便更清楚地查看错误,只需使用工具按线程名称或测试用例或其他方式筛选文件即可。为什么事情会变得过于复杂?如果要使用过度设计的方法,只需使用筛选附加器将不同的日志转储到不同的文件中。如果要对日志输出运行断言,最好不要使用文件附加器,但要配置一个特殊的内存追加器,以便于测试用例检查的方式收集所有内容。看看