痛点
我们在开发的 java 项目一般都会记录日志,日志输出位置通常使用相对路径记录到当前启动 jar 包的同一个父文件夹下面。
当我们使用像 jsch、ssh 这种远程启动 java 程序的时候会出现一个问题:
日志会输出到当前登录用户的目录下面(如当前登录用户是root用户,此时日志会记录到 /root 下面,当前登录用户是 ccroot 用户 日志会记录到 /home/ccroot 下面)
这样当我们查看日志的时候只能去当前用户目录下面去找,不符合国际规范😂
解决
方法一
log4j2.xml 修改如下参数为 ${sys:LogHomeRoot}
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<properties>
<!-- 日志备份目录 -->
<Property name="LOG_HOME" value="${sys:LogHomeRoot}" />
</properties>
</configuration>
启动java时指定参数
不管以什么样的方式启动程序,都会在项目运行的根目录下面的 log 目录记录日志
java -DLogHomeRoot=log -jar test.jar
本地开发 idea
非Spring boot 项目在main方法处增加如下代码,设置环境变量代码一定要在所有 log 加载前加载,并按照static加载顺序从上到下加载
public class Main {
/**
* 设置log4j2.xml 日志环境变量
*/
static {
URL location = Main.class.getProtectionDomain().getCodeSource().getLocation();
try {
String path = URLDecoder.decode(location.getPath(), StandardCharsets.UTF_8.displayName());
File jarFile = new File(path);
path = jarFile.getParentFile().getParentFile().getAbsolutePath() + File.separator;
System.setProperty("LogHomeRoot", path + "log");
} catch (UnsupportedEncodingException ignored) {}
}
private static final Logger log = LoggerFactory.getLogger(Main.class);
}
idea 设置JVM环境变量
这样可以通过
方法二
记录日志使用绝对路径,通常这种方式局限性较大,java 程序安装目录不可改变