首页 > 代码库 > 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中日志输出文件指定相对路径的方法