当前位置: 首页 > 知识库问答 >
问题:

最新(2.14.1)Log4J2异步附加程序导致Java进程挂起

高展
2023-03-14

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

log4j2.xml(取自官方appender文档):

<?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)
  • 删除异步附加器(并直接附加到MyFile)会导致程序正常关闭

这是预期的行为,还是错误?我错过了什么吗?

共有1个答案

公良鸿禧
2023-03-14

似乎已报告并修复。

无论如何,2.14.1不再可行(由于臭名昭著的CVE-2021-44228 RCE漏洞),并且考虑到后来发现的几个漏洞,现在建议升级到2.17.0或更高版本,其中最初声明的LOG4J2-3102也已修复。

 类似资料:
  • 我有一个类,我在其中获取我的所有属性,并在日志记录之前隐藏它们的密码。 我已经迁移到log4j2,并希望测试这个类,检查log4j2的输出。它目前使用log4j并且可以工作,但是当我迁移到log4j2时,我得到了 但是,还有其他与这个mock的交互:mockappender.getName();->在org.apache.logging.log4j.core.config.AbstractConf

  • Im使用具有以下依赖关系的log4j2: 编辑:我尝试添加includeLocation=“true”,但结果仍然相同 谢谢

  • 问题内容: 我需要将事件记录到系统日志中。我使用lo4j2和syslog附加程序。我的appender阻止如下所示: 如您所见,我有一个带有特定PatternLayout的Console附加程序和RollingFile附加程序。我想对Syslog附加程序使用相同的PatternLayout。但是,系统日志中的日志消息似乎总是使用预定义的布局。我尝试执行以下操作: 但这没有任何作用。syslog消息

  • 我在java应用程序中使用log4j2。就日志功能而言,一切都很好,但是在启动应用程序时,它似乎会导致非常明显的延迟。 我已经把代码剥离到基本的 如果不包括log4j2,那么当我运行应用程序时,控制台中就会出现“TEST”,包括构建路径中的log4j2代码和文件夹,这会导致测试出现时间延迟40-50秒。 log4j2.xml中设置为跟踪的标志 谢谢你的帮助,亚历克西斯

  • 问题内容: 我在log4j2中创建了一个自定义附加程序。使用自定义追加程序时,出现以下错误:“ ERROR试图追加到未启动的追加程序”。任何帮助表示赞赏。 问题答案: Log4j 2将检查每个日志事件附加器是否处于可用状态。您看到的错误是Log4j检测到尚未准备好使用附加程序。 一些附加器需要进行准备才能使用。在生命周期的方法是其中追加程序可以做初始化的地方。Log4j不会将事件路由到未处于STA

  • 问题内容: 我试图运行一个异步进程,但我不希望程序等到这些进程执行结束。我发现了这个问题,如何从Java程序中异步运行shell脚本,但是它没有我想要的答案。 我正在做的只是运行bash进程,而在运行bash进程后,我不希望Java程序等到完成为止。这是我所做的: 我还在main方法的末尾放出了另一张印刷品,因此得到以下输出: 但是,程序不会终止,因为这两个进程尚未终止。 我该如何解决这个问题?