默认情况下,何时不在日志中使用 AsyncAppender

2022-09-02 09:37:26

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


答案 1

充当另一个追加器的调度程序。它缓冲日志事件并将其调度到,例如,a或a等。AsyncAppenderFileAppenderConsoleAppender

  • 为什么使用 ?AsyncAppender

  • 缓冲区记录事件,允许应用程序代码继续运行,而不是等待日志记录子系统完成写入。这可以提高应用程序的响应能力,在底层追加器响应缓慢的情况下,例如数据库或文件系统可能容易发生争用。AsyncAppender

  • 为什么不将其设置为默认行为?

  • 无法写入文件或控制台或数据库或套接字等。相反,它只是将日志事件委托给可以执行此操作的追加器。如果没有底层的附加器,AsyncAppender实际上是一个无操作。AsyncAppender

  • 日志事件的缓冲区位于应用程序的堆上;这是一个潜在的资源泄漏。如果缓冲区的生成速度快于耗尽缓冲区的速度,则缓冲区将消耗应用程序可能要使用的资源。

  • 需要配置来平衡无损失和资源泄漏的竞争需求,并处理其缓冲区的关机时耗尽,这意味着管理和推理比简单地使用同步写入更复杂。因此,在偏爱简单性而不是复杂性的基础上,Logback 的默认写入策略是同步的。AsyncAppender

公开了可用于解决潜在资源泄漏的配置杠杆。例如:AsyncAppender

  • 您可以增加缓冲区容量
  • 您可以指示 Logback 在缓冲区达到最大容量后删除事件
  • 您可以控制丢弃哪些类型的事件;在错误事件等之前删除跟踪事件

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

但是,确保成功写入日志事件的最简单最安全的方法仍然是同步写入它们。仅当遇到已证明的问题时,才应考虑这一点,即写入追加器会严重影响应用程序的响应能力/吞吐量。AsyncAppender


答案 2

推荐