MacOS环境下Logback无法按JAR包相对路径写入日志的问题咨询
Logback跨Windows/Mac日志路径不一致解决方案
你现有logback配置本身没有问题,行为差异来自Java工作目录的系统默认取值不同:
- Windows下双击启动脚本/Jar包时,系统会自动将工作目录切换到文件所在目录,因此相对路径
log/logExport.txt会正常生成在应用根目录下 - Mac下如果启动脚本没有手动切换工作目录,Java读取的
user.dir系统属性为执行启动命令时的终端目录(默认是用户主目录),因此日志会写在主目录下
最优修复方案(无需修改Jar包、无需额外配置)
直接修改Mac端的bash启动脚本,在执行Jar包前先切换到Jar包所在的目录即可,示例脚本如下:
#!/bin/bash # 获取当前脚本所在的绝对路径 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) # 切换工作目录到脚本所在目录(即应用存放目录) cd "${SCRIPT_DIR}" || exit 1 # 启动应用,替换为你实际的Jar包名和启动参数 java -jar your-app.jar
该方案完全符合你的需求:
- 不需要修改已打包在Jar内的logback.xml配置
- 不需要客户额外配置属性文件,直接用脚本启动即可
- 同时兼容多平台,Windows批处理脚本也可以用类似逻辑(
cd /d %~dp0)切换工作目录
可选修复方案(仅当无法修改启动脚本时使用)
如果确实不能调整启动脚本,可以在Java应用启动的最早期(Logback上下文初始化前),手动获取Jar包所在目录,动态调整日志输出路径,代码示例逻辑如下:
public static void main(String[] args) throws URISyntaxException { // 第一步:获取Jar包所在目录 String jarPath = MainClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath(); String appDir = new File(jarPath).getParent(); // 第二步:重设工作目录系统属性,Logback加载时会自动读取 System.setProperty("user.dir", appDir); // 后续正常启动Java/Spring应用 }
注意该方案需要重新打包应用,优先级低于修改启动脚本的方案。
内容的提问来源于stack exchange,提问作者Jonathan Lully
相关产品推荐
相关产品推荐

