Log4j滚动日志时死锁,升级桥接包后遇配置异常求助
Log4j 1.2桥接包死锁及升级后配置异常问题解决
问题概述
- 运行环境:Liferay 6.2、Java 1.8
- 初始依赖:
log4j-1.2-api-2.17.2+ Log4j 2.17.2,因应用规模限制无法直接迁移至Log4j 2.x原生API - 核心问题1:日志滚动(rollover)触发死锁,导致应用完全挂起
- 核心问题2:升级至
log4j-1.2-api-2.23.1、log4j-api-2.23.1、log4j-core-2.23.1后,启动报错「无法创建RollingFileAppender,未提供文件名」,伴随空指针异常
针对初始死锁问题的修复方案
Log4j 2.17.2版本的桥接包在高并发日志滚动场景下存在锁竞争缺陷,RollingFileAppender的同步IO逻辑易导致死锁,可通过以下方式缓解:
调整滚动策略与IO参数
- 将
RollingFileAppender的immediateFlush设为false,减少IO锁的持有时长 - 延长滚动触发间隔(如
TimeBasedTriggeringPolicy的interval设为大于1的值),降低滚动触发频率,减少锁竞争概率
- 将
切换为异步滚动Appender
改用AsyncRollingFileAppender将IO操作异步化,避免主线程因等待锁而阻塞,配置示例:
<Appenders> <AsyncRollingFile name="AsyncRollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyy-MM-dd}.log"> <PatternLayout pattern="%d{ISO8601} [%t] %-5p %c %x - %m%n"/> <TimeBasedTriggeringPolicy interval="1"/> </AsyncRollingFile> </Appenders>
针对升级后配置异常的修复方案
Log4j 2.23.x对桥接包的配置兼容性做了严格校验,原Log4j 1.x风格配置的属性映射逻辑有变化,需针对性调整:
- 修正文件名属性映射
Log4j 1.x的File属性在新版本桥接包中需准确映射为Log4j 2.x的fileName属性,检查配置是否存在拼写错误或属性缺失。若原1.x风格配置仍报错,可直接改用Log4j 2.x格式的配置(桥接包可兼容加载):
<Configuration status="WARN"> <Appenders> <RollingFile name="FILE" fileName="logs/app.log" filePattern="logs/app-%d{yyyy-MM-dd}.log"> <PatternLayout pattern="%d{ISO8601} [%t] %-5p %c %x - %m%n"/> <TimeBasedTriggeringPolicy/> </RollingFile> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="FILE"/> </Root> </Loggers> </Configuration>
清理冲突依赖
升级后需检查项目依赖树,排除旧版本Log4j 1.x或Log4j 2.x的遗留JAR包,避免类加载冲突:- Maven项目执行:
mvn dependency:tree - Gradle项目执行:
./gradlew dependencies
找到冲突依赖后,通过<exclusions>(Maven)或exclude(Gradle)规则移除
- Maven项目执行:
修复空指针异常
空指针通常源于配置必填项缺失,检查以下内容:RollingFileAppender的fileName、filePattern属性是否完整赋值layout、triggeringPolicy等核心配置项是否未定义- 避免使用未初始化的变量或空值作为配置参数
内容的提问来源于stack exchange,提问作者phantom
相关产品推荐
相关产品推荐

