【问题标题】:Separate thread for compressing logfiles in Logback?用于在 Logback 中压缩日志文件的单独线程?
【发布时间】:2026-01-19 18:35:02
【问题描述】:

在Logback中,我们可以这样配置: 1 当日志文件的大小达到50MB左右时,旋转文件并压缩它。所以我想知道它会在一个单独的线程中进行压缩,它会有任何性能问题吗?

【问题讨论】:

    标签: java performance logging logback


    【解决方案1】:

    我已经调查了 logback-1.0.3。 让我们考虑用例:

    1. 您在代码中调用Logger#error(String)
    2. 您的数据filtered 根据 Logger 配置。
    3. 将在buildLoggingEventAndAppendcallApenders 之后调用Appenders
    4. 在您的情况下,将调用 OutputStreamAppender 中的 append 方法。
    5. 基于触发器的RollingFileAppender 将在事件触发时调用rollover
    6. 在翻转方法中将调用appropriate compress method

    如您所见,所有内容都将被记录并压缩在与记录数据相同的线程中。因此,您不应登录时间关键线程。

    就我个人而言,我认为登录同一个线程对于大多数应用程序来说并不重要,但这很大程度上取决于您的环境、性能要求等

    如果你想异步记录数据,你可以使用AsyncAppender。在这种情况下,压缩也将在单独的线程中。

    【讨论】:

    • 也许在与记录的数据相同的线程中调用压缩方法的一种可能解决方案是在...之间使用异步附加程序。
    • @AdamDyga 你是对的。这是解决此问题的合法解决方法。
    • logback 文档说异步追加器使用固定大小的阻塞队列,如果队列开始填满,就像压缩大文件时可能发生的那样,它会丢弃 INFO 级别及以下的消息(您可以调整或禁用它)。如果队列一直填满,则调用线程会阻​​塞,因此行为再次变得有效同步。您可以调整队列大小和文件大小来避免这种情况。