【发布时间】:2011-04-10 09:00:58
【问题描述】:
我们正在为几个 Web 应用程序从 log4j 迁移到 logback。在关闭我们的应用程序时,我们当前调用:
org.apache.log4j.LogManager.shutdown();
这应该刷新所有异步日志记录并关闭所有外部资源(文件、套接字)。
logback 中是否有类似的东西,或者它是否会在关机时自动刷新?
迈克
【问题讨论】:
-
有趣的问题——我从来没有真正想过这个问题。由于您必须显式配置 log4j 以缓冲输出,因此我假设可能只需要在这种情况下调用关闭。不过,我相信 slf4j 默认会缓冲。
-
logback 在每条日志语句之后刷新,所以除非你在做一些时髦的事情,否则不需要显式的 stop() 调用。
-
@DavidRoussel 这句话让我看了Logback Appenders。确实:默认情况下,每个日志事件都会立即刷新到底层输出流。这种默认方法更安全,因为如果您的应用程序在没有正确关闭附加程序的情况下退出,日志事件不会丢失。但是,为了显着提高日志记录吞吐量,您可能需要将底层编码器的 immediateFlush 属性设置为 false 。编码器,特别是 LayoutWrappingEncoder 将在单独的章节中描述。
-
@DavidTonhofer 将 immediateFlush 设置为 false 的问题在于,它仅在缓冲区已满时才刷新。因此,如果您跟踪日志文件,则可能在您的应用程序中发生了一个操作,但您可能不会在日志中看到它,因为它位于等待刷新的缓冲区中。出于这个原因,我更喜欢使用 AsyncAppender。理想情况下,当没有更多异步日志事件挂起时,将有某种方法可以使用 AsyncAppender 和 immediateFlush=false 并刷新。但这没有实现。