【问题标题】:Is it possible to have Log4J 2 keep everything in memory and output on demand?是否可以让 Log4J 2 将所有内容保存在内存中并按需输出?
【发布时间】:2021-02-05 19:50:06
【问题描述】:

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

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

【问题讨论】:

  • 为什么不将日志发送到文件中,如果失败,让 CI 将日志文件保存在其“工件”或您的 CI 所称的任何内容中?
  • @Renato 没什么意义,反正 CI 完成后会让我查看原始文件。

标签: java maven-3 log4j2 junit5


【解决方案1】:

不,那个观察者仍然是它(换句话说,写你自己的),因为你的请求仍然很奇怪。时间不会改变这一点。

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

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

关键原则是:稍后执行此操作的单独进程(甚至可能不是用 java 编写的)。

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

【讨论】:

  • 哈哈,我根本无法配置我们的 CI 系统。它由另一个团队管理。也没有真正注意到一个可以开箱即用的 CI 系统。
  • 当有人回答“你到底为什么想要那样做?”时,我很烦。 OP清楚地说明了他们为什么要这样做,并且推理非常合理。我目前正在开发的产品会产生如此多的日志流量,以至于我们必须每 5 分钟包装 100 个日志文件。但是当出现问题时,我们需要失败项目的所有信息。我们不需要它来完成所有成功的工作。
  • @JohnCalcote 问题是正确提出的 X/Y:我有问题 X,我相信正确的解决方案是 Y;有人可以给我关于 Y 的建议吗? - 这个答案改为回答 X,并被接受。您似乎完全错过了重点,应该重新阅读答案 - 它为您提供了处理这种情况的正确方法。
  • @rzwitserloot - 您的用例(系统即将崩溃)是一个小案例。这里真正的问题是我们的日志记录比我们需要的多 1000%。一个可能的解决方案是将记录的信息保留在内存中足够长的时间,以确定是否需要在将其填满磁盘之前对其进行记录。解决“系统即将崩溃”的一种方法是安装一个记录所有内存缓冲区的崩溃处理程序。我知道 - 这并不总是有效,但正如我所说,OP 最初的问题不是关于如何在进程崩溃之前将正确的数据写入磁盘。
  • 这不是一个小角落;它很少相关,但当它相关时,它非常重要,所以,'微小的数字 * 巨大的数字 = ????'。黑天鹅事件 - 工作原理相同。你还是误解了答案。解决方案是一个单独的过程,它从消防软管中压缩/选择相关的东西。那里有很多工具,因为它不会与您如此贬低地决定挥手离开的那个角落案例发生冲突。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多