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

导出的可运行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:16:09