是否可以让 Log4J 2 将所有内容保存在内存中并按需输出?

Is it possible to have Log4J 2 keep everything in memory and output on demand?

好的,所以我想解决的问题是 CI 中的测试过于冗长。现在我可以关闭一般的日志记录,但是当您实际需要调试日志记录时,这会造成伤害。我想我想做的是在内存中累积所有日志,然后设置套件出错或成功时发出的实际级别,然后 emit/append 需要的日志。如果我可以通过在异常堆栈失败时检查异常堆栈以某种方式做到这一点,则可以获得加分。这可能吗?

possible duplicate 确实是同一个问题,但是 6 年来我们已经有了 log4j2 和 junit5,所以我想我想知道这是否已经改变。

不是,那个watcher还是它(写你自己的,换句话说),因为你的要求还是很奇怪。时间不会改变这一点。

日志框架喜欢尽快编写,而不是稍后编写。毕竟,也许 VM 即将硬崩溃,这绝对是缓存一些写入的最糟糕的时间 - 提供对硬崩溃的洞察力的日志语句现在丢失了。

通常,解决方案是使用读取日志文件并以某种方式处理它们的工具 - 通常,通过在复制和压缩它们时删除大部分行,保留完整的转储(和未压缩)仅适用于最近的几个日志。

关键原则是:一个单独的过程(甚至可能不写在 java 中)稍后执行此操作。

您可以配置您的 CI 系统来执行此操作吗?这听起来像是正确的方法:以非常冗长的级别记录日志,如果测试成功,CI 系统在测试后将日志剥离到更严格的级别运行。

对于 JUnit 4,库 System Rules 允许您抑制为成功测试而写入控制台的输出。您必须将规则 SystemErrRuleSystemOutRule 添加到您的测试中。

@Rule
public final SystemErrRule muteSystemErr
    = new SystemErrRule().muteForSuccessfulTests();

@Rule
public final SystemOutRule muteSystemOut
    = new SystemOutRule().muteForSuccessfulTests();

免责声明:我是系统规则的作者。