You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:36:25