我有一个测试框架,它使用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改变文件?
1条答案
按热度按时间9rygscc11#
我不确定log4j2是否支持这种情况。一个选项是在代码中完全关闭log4j2:
字符串