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 程序安装目录不可改变

### Log4j2 日志文件存储路径配置 对于Log4j2而言,日志文件的存储位置可以通过配置文件中的特定属性来指定。通常情况下,在`log4j2.xml`或类似的XML配置文件里定义这些设置。 #### 使用绝对路径 可以直接设定具体的目录作为日志输出的目标地址: ```xml <Configuration status="WARN"> <Appenders> <File name="MyFile" fileName="/var/log/myapp/application.log"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </File> </Appenders> </Configuration> ``` 此段代码展示了如何通过`fileName`属性指明一个位于服务器上的固定位置用于保存日志文件[^4]。 #### 利用环境变量或系统属性 为了提高灵活性并适应不同部署场景的需求,推荐采用占位符的方式引入外部参数,比如使用`${sys:someProperty}`语法访问Java系统的属性,或是利用Spring框架提供的`${some.property}`形式读取应用程序上下文中定义好的值: ```xml <Appenders> <!-- 错误示范 --> <!--<param name="File" value="${webApp.root}/logs/webapp.log"/>--> <!-- 正确做法如下所示 --> <RollingFile name="RollingFile" fileName="${sys:catalina.base}/logs/app.log" filePattern="${sys:catalina.base}/logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}.log.gz"> ... </RollingFile> </Appenders> ``` 这里展示了一个更优的做法,即借助于`${sys:catalina.base}`这样的表达式动态获取Tomcat安装根目录下的子文件夹作为目标路径[^2]。 #### 应用程序内部资源定位 如果希望基于项目自身的结构来决定日志位置,则可以在启动阶段计算出合适的基址,并将其传递给Log4j2。这可能涉及到自定义初始化逻辑,例如在Web应用中重写Servlet的行为以加载额外的配置项[^3]。 另外一种常见的实践是在Spring Boot环境中直接修改`application.properties`或YAML格式的应用配置文档,从而间接影响最终的日志记录行为[^5]: ```properties logging.file.name=./my-log-file.log # 或者针对多个模块分别指定不同的日志输出点 logging.file.path=/path/to/logs/ ``` 综上所述,根据实际需求选择合适的方法来进行Log4j2日志文件存储路径的配置是非常重要的。无论是静态硬编码还是灵活运用各种可变因素,都应当确保所选方案既满足功能要求又便于维护管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值