Log4j2 AsyncAppenderEventDispatcher线程冻结,疑似死锁?是否为误报?
Log4j2 AsyncAppenderEventDispatcher 潜在死锁告警排查
告警信息
YourKit检测到Log4j2的AsyncAppenderEventDispatcher线程存在潜在死锁,告警栈如下:
Potential deadlock: frozen threads found It seems that the following threads have not changed their stack for more than 10 seconds. These threads are possibly (but not necessarily!) in a deadlock or hung. +--------------------------------------------------------------------------------------------------------------------------------+ | Name | +--------------------------------------------------------------------------------------------------------------------------------+ | +---Log4j2-AsyncAppenderEventDispatcher-2-Async Frozen for at least 9m 2s <Ignore a false positive> | | | | | +---jdk.internal.misc.Unsafe.park(boolean, long) Unsafe.java (native) | | | | | +---java.util.concurrent.locks.LockSupport.park(Object) LockSupport.java:194 | | | | | +---java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() AbstractQueuedSynchronizer.java:2081 | | | | | +---java.util.concurrent.ArrayBlockingQueue.take() ArrayBlockingQueue.java:417 | | | | | +---org.apache.logging.log4j.core.appender.AsyncAppenderEventDispatcher.dispatchAll() AsyncAppenderEventDispatcher.java:71 | | | | | +---org.apache.logging.log4j.core.appender.AsyncAppenderEventDispatcher.run() AsyncAppenderEventDispatcher.java:63 | +--------------------------------------------------------------------------------------------------------------------------------+
Log4j2 配置
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="INFO" packages="com.mycompany.logging"> <Appenders> <RollingFile name="RollingJson" fileName="logs/application.log.json" filePattern="logs/application.log.json.%i" bufferedIO="true" bufferSize="1024"> <MyCompanyJsonLayout/> <Policies> <SizeBasedTriggeringPolicy size="1MB"/> </Policies> <DefaultRolloverStrategy max="100"/> </RollingFile> <Async name="Async"> <AppenderRef ref="RollingJson"/> </Async> </Appenders> <Loggers> <Root level="${env:LOG_LEVEL:-INFO}"> <AppenderRef ref="Async"/> </Root> </Loggers> </Configuration>
告警分析与排查建议
这大概率是误报
从线程栈可以看出,线程卡在ArrayBlockingQueue.take()方法上——这是Log4j2 AsyncAppender的正常 idle 行为:当异步队列中没有待处理的日志事件时,Dispatcher线程会阻塞等待新的日志事件进入队列,并非死锁或挂起。
YourKit的告警逻辑是基于线程栈长时间未变化触发的,但这种阻塞等待是设计预期的,不属于异常情况。
进一步排查确认
- 检查对应时间段的应用日志输出情况:如果这段时间应用确实没有生成日志,那可以直接确认是误报;如果有日志生成但未被写入文件,再深入排查
- 检查AsyncAppender的队列配置:默认队列容量为1024,可确认是否存在队列满导致的生产者阻塞(但当前栈是消费者线程在
take(),所以队列空的可能性更大) - 验证自定义
MyCompanyJsonLayout的逻辑:如果Layout在处理日志时存在阻塞或死锁,会影响日志处理,但当前线程栈显示Dispatcher并未在处理日志,而是等待队列事件,因此该点优先级较低
内容的提问来源于stack exchange,提问作者sp00m
相关产品推荐
相关产品推荐

