导出的可运行Jar包中Log4j2无法正常工作问题排查
解决Log4j2导出Jar后无法生成日志的问题
可能的原因及对应修复方案
1. 系统属性logFileName未正确传递
你的配置里使用${sys:logFileName}作为日志文件名,但Jar运行时如果没通过JVM参数传递这个属性,Log4j2无法解析变量,会导致无法创建日志文件。
修复:
运行Jar时添加系统参数:
java -DlogFileName=your-log-name.log -jar your-app.jar
如果需要固定文件名,也可以直接把配置里的${sys:logFileName}替换成具体文件名,比如app.log:
<RollingFile name="File" fileName="FirmLogs/app.log" filePattern="FirmLogs/app.log.%i">
注意:filePattern建议加上%i后缀,否则滚动策略触发后会覆盖原文件,失去滚动日志的意义。
2. FirmLogs目录未自动创建
Log4j2部分版本不会自动创建日志目录,Jar运行时若当前工作目录下没有FirmLogs文件夹,就无法生成日志文件。
修复:
- 方法一:手动在Jar所在目录创建
FirmLogs文件夹。 - 方法二:修改Log4j2配置,添加
createOnDemand="true"(Log4j2 2.9+版本支持):
<RollingFile name="File" fileName="FirmLogs/${sys:logFileName}" filePattern="FirmLogs/${sys:logFileName}.%i" createOnDemand="true">
也可以搭配滚动策略自动清理旧日志,同时确保目录创建:
<RollingFile ...> <DirectWriteRolloverStrategy> <DefaultRolloverStrategy> <Delete basePath="FirmLogs" maxDepth="1"> <IfFileName glob="*.log.*" /> <IfLastModified age="7d" /> </Delete> </DefaultRolloverStrategy> </DirectWriteRolloverStrategy> <!-- 原有PatternLayout、TriggeringPolicy配置 --> </RollingFile>
3. 工作目录不匹配
./FirmLogs是相对执行命令的工作目录,而非Jar文件所在目录。比如你在/home/user目录下执行java -jar ./apps/your-app.jar,日志会生成在/home/user/FirmLogs,而非Jar所在的/home/user/apps/FirmLogs。
修复:
- 方法一:切换到Jar所在目录再运行命令:
cd /path/to/jar-directory java -DlogFileName=app.log -jar your-app.jar
- 方法二:通过代码获取Jar所在目录并设置为系统属性,再在配置中引用。比如在启动类中添加:
// 获取Jar所在目录 String jarDir = new File(YourMainClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent(); System.setProperty("logDir", jarDir + "/FirmLogs");
然后修改Log4j2配置:
<RollingFile name="File" fileName="${sys:logDir}/${sys:logFileName}" filePattern="${sys:logDir}/${sys:logFileName}.%i">
4. 权限不足
如果Jar所在目录没有写入权限,系统无法创建FirmLogs目录或日志文件。
修复:
检查Jar所在目录的读写权限,给当前用户添加写入权限,比如Linux下:
chmod +w /path/to/jar-directory
验证配置有效性
你的配置已经在Configuration标签设置了status="DEBUG",运行Jar时控制台会输出Log4j2的初始化日志,从中可以查看日志路径解析是否正确、目录是否创建成功等信息,帮助快速定位问题。
内容的提问来源于stack exchange,提问作者Parag Keshar Das
相关产品推荐
相关产品推荐

