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类加载、字节码验证等操作耗时更长,导致插件扫描过程阻塞。多次出现插件扫描日志,可能是初始化流程中重复触发了扫描逻辑,进一步拉长了耗时。
解决办法
预生成插件缓存文件
通过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启动时直接读取该文件,跳过扫描步骤。
精简依赖插件
只保留实际需要的Log4j2模块,比如不需要异步日志、JSON输出等功能时,移除对应依赖JAR,减少扫描的插件数量。优化JVM启动参数
- 添加
-XX:+TieredCompilation -XX:TieredStopAtLevel=1,降低JIT编译开销,加快启动速度。 - 生产环境谨慎使用
-Xverify:none关闭字节码验证,减少启动阶段的验证耗时。
- 添加
降低配置日志级别
将配置文件中status="trace"改为status="warn"或status="error",减少启动时的日志IO开销。
内容的提问来源于stack exchange,提问作者Tony Goacher
相关产品推荐
相关产品推荐

