当我在登录中检查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/

10-09 09:48