当我在登录中检查AsyncAppender的文档时,找不到支持AsyncAppender的线程池设置之类的东西。
这是否意味着只有1个线程可以使用阻塞队列中的日志事件? (虽然日志事件可以由多个线程产生,例如20-40)
谢谢
里昂
最佳答案
从the docs:
AsyncAppender将事件缓存在BlockingQueue中。由AsyncAppender创建的辅助线程从队列的开头获取事件,并将其分配到附加到AsyncAppender的单个追加程序。
看一下代码; AsyncAppenderBase
启动Thread
的单个实例以从附加程序的blockingQueue
中获取事件。
因此,是的,只有一个工作线程,该线程负责消耗可能由多个应用程序线程发出的日志事件。
如果您担心此工作线程可能无法尽快处理这些事件,则可以调整以下属性:queueSize
:阻塞队列的最大容量。默认情况下,queueSize设置为256。discardingThreshold
:默认情况下,当阻塞队列剩余容量为20%时,它将丢弃级别TRACE,DEBUG和INFO的事件,仅保留级别WARN和ERROR的事件。要保留所有事件,请将discardingThreshold设置为0。
您可以增加queueSize
以确保您不会丢失任何事件(尽管这会占用资源,因为保留的事件将一直驻留在应用程序的堆上,直到它们被分派到基础追加程序为止)。或者,您可以通过设置discardingThreshold
来提高性能(以丢失优先级较低的事件为代价)。
关于java - 关于logback的AsyncAppender,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48056939/