java项目根据启动位置指定 log4j2日志输出到指定目录

痛点

我们在开发的 java 项目一般都会记录日志,日志输出位置通常使用相对路径记录到当前启动 jar 包的同一个父文件夹下面。

当我们使用像 jsch、ssh 这种远程启动 java 程序的时候会出现一个问题:

日志会输出到当前登录用户的目录下面(如当前登录用户是root用户,此时日志会记录到 /root 下面,当前登录用户是 ccroot 用户 日志会记录到 /home/ccroot 下面)

这样当我们查看日志的时候只能去当前用户目录下面去找,不符合国际规范

解决

方法一

log4j2.xml 修改如下参数为 ${sys:LogHomeRoot}


<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项目根据启动位置指定 log4j2日志输出到指定目录_第1张图片

方法二

记录日志使用绝对路径,通常这种方式局限性较大,java 程序安装目录不可改变

你可能感兴趣的:(java,开发语言,log4j2)