背景:
在log4j2中使用asyncappender时,您可以将记录器的参数“blocking”设置为false,这样任何溢出缓冲区大小的日志都将被丢弃,而不会减慢主线程的速度。 (参见asyncAppender https://logging.apache.org/log4j/2.x/manual/appenders.html)
我正在将我们的应用程序升级到这里找到的光荣的asyncLogger结构:https://logging.apache.org/log4j/2.x/manual/async.html
虽然我看到我可以设置环形缓冲区大小,但我没有看到任何声明我可以阻止它阻止应用程序主线程,
问题:
所以只是为了确定我在这里问,因为我没有在文档中看到任何内容,如果有更多的日志进入而不是日志出去(比如我们将它们存放在数据库中并且插入需要一段时间)所以使用asyncloggers超出额外日志时会超出ringbuffersize吗?并且主线程会以任何方式减慢吗?
谢谢!
答案 0 :(得分:3)
使用异步记录器,如果你的appender无法跟上应用程序的日志记录速率,那么ringbuffer最终会填满。当ringbuffer已满时,记录器将阻止尝试将日志事件添加到ringbuffer,因此,应用程序线程将受到影响。
default ringbuffer size如此之大的一个原因是它可以处理日志事件的“突发”而不会影响应用程序。但是,选择适合(可以处理)应用程序的持续日志记录速率的appender非常重要。 (用2到3次目标载荷测试是一个好主意。)
仅供参考,log4j 2附带的最快的追加者是RandomAccessFileAppender(及其Rolling variant)。
下一个版本(2.5.1)will have a feature允许用户在环形缓冲区满80%或更多时丢弃事件(例如DEBUG和TRACE事件)。
答案 1 :(得分:1)
如果在AsyncAppender上设置了阻塞并且队列已满,则会显示事件将传递给在errorRef属性上配置的Appender(如果已配置)。
但是,您还询问了使用异步记录器时会发生什么,这是独立的。因此,一切都是异步的,我非常确定处理方式与AsyncAppender不同。