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

最佳答案

AsyncAppender充当另一个附加程序的调度程序。它缓冲日志事件并将其分派(dispatch)到FileAppenderConsoleAppender等。

  • 为什么使用AsyncAppender
  • AsyncAppender缓冲日志事件,允许您的应用程序代码继续运行,而不是等待日志子系统完成写操作。在基础追加程序响应缓慢的情况下,例如,这可以提高应用程序的响应速度。易于争用的数据库或文件系统。
  • 为什么不使其成为默认行为?
  • AsyncAppender无法写入文件或控制台,数据库或套接字等。相反,它只是将日志事件委托(delegate)给可以执行此操作的附加程序。如果没有底层的附加程序,则AsyncAppender实际上是无操作的。
  • 日志事件的缓冲区位于应用程序的堆上。这是潜在的资源泄漏。如果缓冲区的建立速度比耗尽缓冲区的速度快,那么缓冲区将消耗您的应用程序可能要使用的资源。
  • AsyncAppender需要进行配置以平衡无损和资源泄漏的竞争需求,并处理其缓冲区的关机消耗,这意味着管理和推理比简单地使用同步写入更为复杂。因此,在优先考虑简单性而不是复杂性的基础上,Logback的默认写策略应该是同步的。
  • AsyncAppender公开了可用于解决潜在资源泄漏的配置杠杆。例如:
  • 您可以增加缓冲区容量
  • 您可以指示Logback在缓冲区达到最大容量后丢弃事件
  • 您可以控制丢弃什么类型的事件。在ERROR事件等
  • 之前删除TRACE事件
    AsyncAppender还公开了配置杠杆,您可以使用这些杠杆来限制(尽管不能消除)应用程序关闭期间的事件丢失。
    但是,确保成功写入日志事件的最简单最安全的方法仍然是同步写入,这仍然是事实。仅当您存在经证实的问题,即写入附加程序会严重影响应用程序的响应能力/吞吐量时,才应考虑使用AsyncAppender

    07-24 15:03