默认情况下何时不在Logback中使用AsyncAppender

时间:2017-11-18 23:15:07

标签: java logging logback

Logback支持在类中使用async appender ch.qos.Logback.classic.AsyncAppender并且根据文档,这将减少应用程序的日志记录开销。那么,为什么不把它作为开箱即用的默认设置。使用同步追加器可以更好地服务于哪些用例。我可以通过Async appender看到的一个问题是日志消息不是按时间顺序排列的。还有其他这样的限制吗?

1 个答案:

答案 0 :(得分:7)

AsyncAppender充当另一个appender的调度程序。它会缓冲日志事件并将其发送到FileAppenderConsoleAppender等。

  • 为什么要使用AsyncAppender

    • AsyncAppender缓冲日志事件,允许您的应用程序代码继续前进,而不是等待日志子系统完成写入。这可以提高您的应用程序的响应能力,以防下层的appender响应缓慢,例如数据库或文件系统,可能容易发生争用。
  • 为什么不将它设为默认行为?

    • AsyncAppender无法写入文件或控制台或数据库或套接字等。相反,它只是将日志事件委托给可以执行此操作的追加程序。没有底层的appender,AsyncAppender实际上是一个无操作。
    • 日志事件的缓冲区位于应用程序的堆上;这是潜在的资源泄漏。如果缓冲区的构建速度比可以消耗的速度快,那么缓冲区将消耗应用程序可能想要使用的资源。
    • AsyncAppender需要进行配置以平衡无损和资源泄漏的竞争需求,并处理其缓冲区的关闭耗尽意味着管理和推理更加复杂而不仅仅是使用同步写入。因此,基于简单优先于复杂性,Logback的默认写策略是同步的。

AsyncAppender公开配置​​杠杆,您可以使用它来解决潜在的资源泄漏问题。例如:

  • 您可以增加缓冲区容量
  • 一旦缓冲区达到最大容量
  • ,您可以指示Logback删除事件
  • 您可以控制丢弃哪些类型的事件;在ERROR事件等之前删除TRACE事件

AsyncAppender还公开了配置杠杆,您可以使用这些杠杆来限制(但不能消除)应用程序关闭期间的事件丢失。

但是,确保成功写入日志事件的最简单最安全的方法仍然是同步写入它们。 AsyncAppender只有在您有一个经过验证的问题时才应考虑,即写入appender会严重影响您的应用程序响应/吞吐量。