junit 如何安全地刷新和停止log4j2中的FileAppender?

czfnxgou  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(99)

我有一个测试框架,它使用RoutingAppender将每个测试的日志路由到它自己的文件。
配置如下所示:

Routing:
      - Name: TestCaseRouted
        Routes:
          Pattern: "${ctx:TestCaseId}"
          Route:
            - File:
                Name: TestCaseLogs
                FileName: "${ctx:TestCaseId}.log"
                Append: false
            - key: "${ctx:TestCaseId}"

字符串
在每次测试结束时,我使用commons IO中的FileUtils.readFileToByteArray获取字节并将其发布给报告程序。

// Junit5 extension
    public void afterEach(ExtensionContext context) {
        deleteCurrentLogAppender();
        ThreadContext.clearMap();
        final File logFile = new File(getTestCaseId() + ".log");
        if (logFile.exists()) {
            byte[] bytes = FileUtils.readFileToByteArray(logFile)); 
            // Publish bytes to reporter
        }
    }

    private void deleteCurrentLogAppender() {
        final LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
        RoutingAppender routingAppender = loggerContext.getConfiguration().getAppender("TestCaseRouted");
        routingAppender.deleteAppender(getTestCaseId());
    }


我在这里遇到了一些问题,因为FileAppender似乎会截断文件,以便在删除文件期间或之后继续写入未刷新的日志(这似乎会在内部调用Appender.stop()),并且文件正在被读取到字节数组。
如果写操作发生在中途,我会从FileUtils.readFileToByteArray得到下面的异常:IOException: Unexpected read size, current: 4096, expected: 6084
在其他情况下,我会在发布的报告中有一个不完整的日志。

如何在阅读日志文件之前完全刷新并阻止FileAppender改变文件?

9rygscc1

9rygscc11#

我不确定log4j2是否支持这种情况。一个选项是在代码中完全关闭log4j2:

// import org.apache.logging.log4j.core.LoggerContext;
// import org.apache.logging.log4j.core.config.Configurator;
     
// get the current context
LoggerContext context = (LoggerContext) LogManager.getContext();
Configurator.shutdown(context);

字符串

相关问题