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

imx6平台log4j2 LoggerFactory.getLogger调用耗时超20秒求助

问题:IMX6平台Log4j2初始化耗时过长(LoggerFactory.getLogger阻塞20+秒)

环境信息

  • 硬件平台:IMX6
  • Kernel版本:5.10.63
  • JDK版本:OpenJDK RTE 16.0.2+7
  • 日志框架版本:SLF4J 2.0.9 + Log4j2 2.21.1

测试代码

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main{    
    public static void main(String[] args)    {        
        Logger myLogger = LoggerFactory.getLogger("Test");        
        myLogger.info("This is a test log");        
        System.out.println("Hello world!");    
    }
}

Log4j2配置文件(log4j2.xml)

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">    
    <Appenders>        
        <Console name="Console" target="SYSTEM_OUT">        
            <PatternLayout pattern="@timestamp:%d{yyyy-MM-dd/HH:mm:ss.SSS/zzz} message%m%n"/>        
        </Console>    
    </Appenders>    
    <Loggers>        
        <Root level="trace">        
            <AppenderRef ref="Console"/>        
        </Root>    
    </Loggers>
</Configuration>

启动命令

date;/usr/lib/jvm/java-16-openjdk/bin/java -Dlog4j2.debug=true  -Dlog4j2.configurationFile=log4j2.xml -jar LoggerTest2.jar

现象

  • 调用LoggerFactory.getLogger时阻塞20秒以上才返回,后续日志功能正常。
  • 移除Log4j相关JAR包后,程序启动无延迟;在x86平台(OpenJDK 16.0.1)运行同样程序,耗时小于1秒。
  • 启动日志中多次出现DEBUG StatusLogger PluginManager 'Core' found 131 plugins。

原因分析

Log4j2的PluginManager初始化时需要扫描所有依赖JAR中的插件,IMX6作为ARM嵌入式平台,CPU性能远低于x86平台,加上嵌入式环境下JDK类加载、字节码验证等操作耗时更长,导致插件扫描过程阻塞。多次出现插件扫描日志,可能是初始化流程中重复触发了扫描逻辑,进一步拉长了耗时。

解决办法

  1. 预生成插件缓存文件
    通过Maven引入Log4j2的插件处理器,编译阶段生成Log4j2Plugins.dat,避免运行时扫描所有JAR:

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.21.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-plugin-processor</artifactId>
        <version>2.21.1</version>
        <scope>provided</scope>
    </dependency>
    

    生成的缓存文件会被打包进JAR,Log4j2启动时直接读取该文件,跳过扫描步骤。

  2. 精简依赖插件
    只保留实际需要的Log4j2模块,比如不需要异步日志、JSON输出等功能时,移除对应依赖JAR,减少扫描的插件数量。

  3. 优化JVM启动参数

    • 添加-XX:+TieredCompilation -XX:TieredStopAtLevel=1,降低JIT编译开销,加快启动速度。
    • 生产环境谨慎使用-Xverify:none关闭字节码验证,减少启动阶段的验证耗时。
  4. 降低配置日志级别
    将配置文件中status="trace"改为status="warn"或status="error",减少启动时的日志IO开销。

内容的提问来源于stack exchange,提问作者Tony Goacher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:13:35