簡體   English   中英

最新 (2.14.1) Log4J2 async appender 導致 Java 進程掛起

[英]Latest (2.14.1) Log4J2 async appender causes Java process to hang

我有一個非常基本的(幾乎是教科書)Log4J2 示例,使用最新的(2.14.1):

log4j2.xml (取自官方附加文檔):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
    <Appenders>
        <File name="MyFile" fileName="logs/app.log">
            <PatternLayout>
                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
            </PatternLayout>
        </File>
        <Async name="Async">
            <AppenderRef ref="MyFile"/>
        </Async>
    </Appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="Async"/>
        </Root>
    </Loggers>
</Configuration>

程序, TestLog.java

public class TestLog {
    private static final org.apache.logging.log4j.Logger l = org.apache.logging.log4j.LogManager.getLogger(TestLog.class);

    public static void main(String[] args) {
        l.error("Boo");
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tuna</groupId>
    <artifactId>log4j2-not-shutting-down</artifactId>
    <version>0</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.14.1</version>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
</project>

當我運行它時,我確實在logs/app.log中得到了預期的 ERROR 日志行; 但是 Java 進程掛起(在main()完成后不會關閉)。 線程轉儲顯示(除了 Java 的本機線程之外)一個非守護進程異步附加線程保持WAITING (很可能是掛起的原因)。

"Log4j2-AsyncAppenderEventDispatcher-1-Async" #15 prio=5 os_prio=0 cpu=0.00ms elapsed=17.04s tid=0x000001bd5bc98000 nid=0x7324 waiting on condition  [0x0000006962bff000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@12/Native Method)
    - parking to wait for  <0x00000007110c2618> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(java.base@12/LockSupport.java:194)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@12/AbstractQueuedSynchronizer.java:2081)
    at java.util.concurrent.ArrayBlockingQueue.take(java.base@12/ArrayBlockingQueue.java:417)
    at org.apache.logging.log4j.core.appender.AsyncAppenderEventDispatcher.dispatchAll(AsyncAppenderEventDispatcher.java:70)
    at org.apache.logging.log4j.core.appender.AsyncAppenderEventDispatcher.run(AsyncAppenderEventDispatcher.java:62)
  • 刪除Async appender(並直接附加到MyFile )會導致程序正確關閉。
  • Async appender 定義添加shutdownTimeout無效。 (無論如何,唯一的日志行已經正確寫入文件,所以它不可能是排隊問題。)
  • log4j-core切換到較低版本(例如2.9.1 )也可以解決掛起問題。

這是預期的行為,還是錯誤? 我錯過了什么嗎?

似乎已經報告和修復

無論如何 2.14.1 不再可行(由於臭名昭著的CVE-2021-44228 RCE 漏洞),並且鑒於之后發現的幾個漏洞,現在建議升級到 2.17.0 或更高版本 - 最初聲明的 LOG4J2-3102 是也固定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM