关于 logback 的 AsyncAppender
About logback's AsyncAppender
当我在logback中查看AsyncAppender的文档时,我没有找到支持AsyncAppender的线程池设置。
这是否意味着只有 1 个线程可以使用阻塞队列中的日志事件? (虽然日志事件可能由多个线程产生,比如 20-40)
谢谢
里昂
我没有检查源代码,但我很确定池中有一个线程。原因是这个进程的多线程意义不大,因为任务的本质是单线程的。考虑一下如果您正在写入一个文件:不可能同时将两条消息附加到一个文件。
也许您希望字符串格式化和 toString 方法在线程外调用...我希望它们不会,因为日志消息的参数可能会在调用后不久被修改。同步性主要是为了防止 I/O 阻塞(例如磁盘延迟)影响性能关键代码。
来自the docs:
AsyncAppender buffers events in a BlockingQueue. A worker thread created by AsyncAppender takes events from the head of the queue, and dispatches them to the single appender attached to AsyncAppender.
并查看代码; AsyncAppenderBase
启动 Thread
的单个实例以从 appender 的 blockingQueue
.
中获取事件
所以,是的,只有一个工作线程,这个线程负责使用可能由多个应用程序线程发出的日志事件。
如果您担心此工作线程可能无法在这些事件产生时尽快处理这些事件,那么您可以调整以下属性:
queueSize
:阻塞队列的最大容量。默认情况下,queueSize 设置为 256。
discardingThreshold
:默认情况下,当阻塞队列剩余容量为20%时,会丢弃TRACE、DEBUG和INFO级别的事件,只保留WARN和ERROR级别的事件。要保留所有事件,请将 discardingThreshold 设置为 0。
您可以增加 queueSize
以确保您不会丢失任何事件(尽管以资源使用为代价,因为保留的事件将位于应用程序的堆上,直到它们被分派到底层附加程序)。或者,您可以通过设置 discardingThreshold
.
来提高性能 - 代价是丢失较低优先级的事件
当我在logback中查看AsyncAppender的文档时,我没有找到支持AsyncAppender的线程池设置。
这是否意味着只有 1 个线程可以使用阻塞队列中的日志事件? (虽然日志事件可能由多个线程产生,比如 20-40)
谢谢
里昂
我没有检查源代码,但我很确定池中有一个线程。原因是这个进程的多线程意义不大,因为任务的本质是单线程的。考虑一下如果您正在写入一个文件:不可能同时将两条消息附加到一个文件。
也许您希望字符串格式化和 toString 方法在线程外调用...我希望它们不会,因为日志消息的参数可能会在调用后不久被修改。同步性主要是为了防止 I/O 阻塞(例如磁盘延迟)影响性能关键代码。
来自the docs:
AsyncAppender buffers events in a BlockingQueue. A worker thread created by AsyncAppender takes events from the head of the queue, and dispatches them to the single appender attached to AsyncAppender.
并查看代码; AsyncAppenderBase
启动 Thread
的单个实例以从 appender 的 blockingQueue
.
所以,是的,只有一个工作线程,这个线程负责使用可能由多个应用程序线程发出的日志事件。
如果您担心此工作线程可能无法在这些事件产生时尽快处理这些事件,那么您可以调整以下属性:
queueSize
:阻塞队列的最大容量。默认情况下,queueSize 设置为 256。discardingThreshold
:默认情况下,当阻塞队列剩余容量为20%时,会丢弃TRACE、DEBUG和INFO级别的事件,只保留WARN和ERROR级别的事件。要保留所有事件,请将 discardingThreshold 设置为 0。
您可以增加 queueSize
以确保您不会丢失任何事件(尽管以资源使用为代价,因为保留的事件将位于应用程序的堆上,直到它们被分派到底层附加程序)。或者,您可以通过设置 discardingThreshold
.