【发布时间】:2018-05-02 11:54:37
【问题描述】:
Logback 支持在类中使用异步 appender
ch.qos.Logback.classic.AsyncAppender 并且根据文档,这将减少应用程序的日志记录开销。那么,为什么不直接将其设为默认设置。使用同步附加程序可以更好地服务于哪些用例。我可以看到 Async appender 的一个问题是日志消息不会按时间顺序排列。还有其他类似的限制吗?
【问题讨论】:
Logback 支持在类中使用异步 appender
ch.qos.Logback.classic.AsyncAppender 并且根据文档,这将减少应用程序的日志记录开销。那么,为什么不直接将其设为默认设置。使用同步附加程序可以更好地服务于哪些用例。我可以看到 Async appender 的一个问题是日志消息不会按时间顺序排列。还有其他类似的限制吗?
【问题讨论】:
AsyncAppender 充当另一个附加程序的调度程序。它缓冲日志事件并将它们分派到FileAppender 或ConsoleAppender 等。
为什么使用AsyncAppender?
AsyncAppender 缓冲日志事件,允许您的应用程序代码继续运行,而不是等待日志子系统完成写入。在底层 appender 响应缓慢的情况下,这可以提高您的应用程序的响应能力,例如可能容易发生争用的数据库或文件系统。
为什么不让它成为默认行为?
AsyncAppender 不能写入文件或控制台或数据库或套接字等。相反,它只是将日志事件委托给可以执行此操作的附加程序。如果没有底层的 appender,AsyncAppender 实际上是一个空操作。
日志事件的缓冲区位于应用程序的堆上;这是潜在的资源泄漏。如果缓冲区的构建速度快于耗尽的速度,那么缓冲区将消耗您的应用程序可能想要使用的资源。
AsyncAppender 需要配置以平衡无丢失和资源泄漏的竞争需求并处理其缓冲区的关闭时耗尽,这意味着管理和推理比简单地使用同步更复杂写道。所以,在优先考虑简单而不是复杂的基础上,Logback 的默认写入策略是同步的是有意义的。
AsyncAppender 公开了可用于解决潜在资源泄漏的配置杠杆。例如:
AsyncAppender 还公开了配置杠杆,您可以使用这些杠杆来限制(但不能消除)应用程序关闭期间的事件丢失。
但是,确保日志事件成功写入的最简单最安全的方法仍然是同步写入它们。 AsyncAppender 仅应在您遇到已证实的问题时考虑,即写入附加程序会严重影响您的应用程序响应能力/吞吐量。
【讨论】: