log4j迁移至log4j2后配置不生效无法生成日志文件问题求助
问题排查及解决方法
核心错误点梳理
- JVM启动参数配置错误
你当前用的是Log4j1的配置指定参数,Log4j2的对应参数已变更,会导致配置文件根本没有被加载。 - Log4j2.xml规则配置错误
你配置的文件AppenderA1仅绑定到了完全无关的org.apache.log4j.xml日志路径,你的业务代码日志不会输出到该文件,所有日志仅通过Root绑定的控制台输出,被shell脚本重定向到了$FicTrac文件中,自然不会生成目标日志文件。 - 路径不匹配问题
你期望的日志路径是C:\LogFolder\mylog.log,但配置里写的是C:\TEMP\LogFolder\mylog.log,多了一级TEMP目录,即使配置正确也会生成到错误路径下。 - 目录权限/自动创建问题
Log4j2默认不会自动创建日志文件的父目录,如果目标目录不存在会导致文件写入失败。
具体修复步骤
1. 修正shell启动脚本的JVM参数
将Log4j配置相关参数替换为Log4j2版本的正确参数:
# 原错误参数:-Dlog4j.configuration=file:/${myprog}/log4jConf.xml -Dlog4j.debug=true # 替换为正确参数后的完整启动命令: "$JAVA_HOME/bin/java" -Dlog4j2.debug=true -Xmx256m -Xms64m -Dcom.mypackage.pack.conf=${myprog}/myconf.properties -Dlog4j2.configurationFile=file:/${myprog}/log4jConf.xml -cp ${myprog}/myjar-SNAPSHOT.jar com.mypackage.pack.MyJavaClass ${paramjava} $@ >> $FicTrac 2>&1
临时排查时可以先去掉末尾的>> $FicTrac 2>&1,直接查看控制台输出的Log4j2初始化日志,确认配置文件是否被正常加载、有没有报错。
2. 修正Log4j2.xml配置
以下是对齐原有Log4j1配置的正确版本,保留按天滚动的特性、日志格式、级别规则:
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <!-- 按天滚动的文件Appender,对齐原DailyRollingFileAppender逻辑 --> <RollingFile name="file" fileName="C:\LogFolder\mylog.log" filePattern="C:\LogFolder\mylog.log.%d{yyyy-MM-dd}" createOnDemand="true"> <!-- 自动创建父目录 --> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n %M:%L"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> </RollingFile> <Console name="STDOUT" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n %M:%L"/> </Console> </Appenders> <Loggers> <!-- 业务包日志级别设置为INFO,输出到文件 --> <Logger name="com.mypackage.pack" level="INFO" additivity="false"> <AppenderRef ref="file"/> <!-- 如果需要业务包日志同时输出到控制台,可以再加一行<AppenderRef ref="STDOUT"/> --> </Logger> <!-- 关闭PERFS日志 --> <Logger name="PERFS" level="OFF"/> <!-- 根日志级别对齐原配置的ERROR,输出到控制台 --> <Root level="ERROR"> <AppenderRef ref="STDOUT"/> <!-- 如果需要全量日志同时输出到文件,可添加 <AppenderRef ref="file"/> --> </Root> </Loggers> </Configuration>
3. 验证路径权限
手动确认C:\LogFolder目录存在,且运行Java进程的用户对该目录有读写权限,避免写入失败。
内容的提问来源于stack exchange,提问作者lulu3131
相关产品推荐
相关产品推荐

