首页 > 代码库 > log4j中日志输出文件指定相对路径的方法

log4j中日志输出文件指定相对路径的方法

我想大多数使用Log4j输出日志到文件系统的朋友可能都碰到过这个问题吧。

那就是在log4j的配置文件中无法指定相对路径,比如如下的配置就会有问题:

log4j.appender.E = org.apache.log4j.RollingFileAppender
log4j.appender.E.File = ../log/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] [%c] %m%n

难道只能指定C:/log/error.log如此绝对路径的形式吗?答案是否定的!下面来看看几种解决办法:


1、使用系统变量

第一步,首先要定义系统变量

这里说的系统变量也就是System.getProperty(..)方法可以得到的变量,比如说user.dir等与操作系统相关的变量会默认加载进来。

另外,利用启动参数-D也可以手动加入系统参数,比如我们可以指定日志路径-Dlog.path="D:/abc/log"。当然,这样写成绝对路径又不灵活了。

其实我们可以在系统启动时在程序初始化的时候来动态选择路径,然后System.setProperty(..),那就万无一失了~

第二步,在log4j配置文件中使用系统变量

如何使用呢?比如我们在系统变量中定义了一个log.path,那么使用时只需要${log.path}就可以得到该属性对应的value值了

需要注意的是,若你使用的是tomcat,那么默认就可以使用${catalina.home}来得到tomcat的根目录

log4j.appender.E.File = ${catalina.home}/logs/error.log

这种方法比较简单方便,推荐!


2、自定义log4j配置文件加载

这种方式的原理是为log4j中配置的路径动态地添加上当前项目的根路径。

在Spring工程中一般都使用org.springframework.web.util.Log4jConfigListener这个类来加载log4j的配置文件

当然底层还是调用PropertyConfigurator.configure(url);或是DOMConfigurator.configure(url);

但是貌似这个配置文件加载之后是无法读取配置,更无法修改单个配置属性,那其实我们就需要在设置到log4j之前来修改某个值了

所以使用这种方式就必须自己定义加载log4j配置文件,思路也比较简单,比如我们用properties文件,在properties指定的输出路径我们只给定相对于项目根路径的相对路径,而项目根路径我们在程序中动态地获取。先将文件加载到Properties,之后通过组装项目根路径以及相对路径并通过set方法来改变log4j.appender.E.File的值,然后再通过PropertyConfigurator.configure(Properties properties)配置到log4j中

下面贴出代码:

public class Log4jInit extends HttpServlet { 
         public void init(ServletConfig config) throws ServletException { 
             String prefix = config.getServletContext().getRealPath("/"); 
             String file = config.getInitParameter("log4j"); 
             String filePath = prefix + file; 
             Properties props = new Properties(); 
             FileInputStream istream = new FileInputStream(filePath); 
             props.load(istream); 
             istream.close(); 
             String logFile = prefix + props.getProperty("log4j.appender.E.File");//设置路径 
             props.setProperty("log4j.appender.E.File",logFile); 
             PropertyConfigurator.configure(props);//装入log4j配置信息 
         } 
}


之后在web.xml中配置好init-parameter并将该servlet的load-on-startup设置为1就可以了~


个人认为第一种方法简单方便,完全可以取代第二种~


log4j中日志输出文件指定相对路径的方法