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

痛点

我们在开发的 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 程序安装目录不可改变

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值