log4j中配置日志文件相对路径方法分析转自:方法一、解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如:log4j.appender.logfile.File=${WORKDIR}/logs/app.log其中“${WORKDIR}/”是个变量,会被SystemProperty中的“WORKDIR”的值代替。这样,我们就可以在log4j加载配置文件之前,先用System.setProperty(WORKDIR,WORKDIR);设置好根路径,此操作可通过一初始的servlet进行。方法二、可以使用服务器环境变量log4j的配置文件支持服务器的vm的环境变量,格式类似${catalina.home}log4j.appender.R=org.apache.log4j.RollingFileAppenderlog4j.appender.R.File=${catalina.home}/logs/logs_tomcat.loglog4j.appender.R.MaxFileSize=10KB其中的${catalina.home}并非windows系统的环境变量,这个环境变量就不需要在Windows系统的环境变量中设置。之所以这样,你可以看看tomcat\bin\catalina.bat(startup,shutdown都是调用这个)里面自带有-Dcatalina.home=%CATALINA_HOME%。继承这个思想,所以你也可以自己设定一个参数-Dmylog.home=D:/abc/log到对应的服务器java启动的vm参数中方法三、通过servlet初始化init()方法中加载file属性实现相对路径具体实现:做一个servlet,在系统加载的时候,就把properties的文件读到一个properties文件中.那个file的属性值(我使用的是相对目录)改掉(前面加上系统的根目录),让后把这个properties对象设置到propertyConfig中去,这样就初始化了log的设置.在后面的使用中就用不着再配置了一般在我们开发项目过程中,log4j日志输出路径固定到某个文件夹,这样如果我换一个环境,日志路径又需要重新修改,比较不方便,目前我采用了动态改变日志路径方法来实现相对路径保存日志文件(1).在项目启动时,装入初始化类:publicclassLog4jInitextendsHttpServlet{staticLoggerlogger=Logger.getLogger(Log4jInit.class);publicLog4jInit(){}publicvoidinit(ServletConfigconfig)throwsServletException{Stringprefix=config.getServletContext().getRealPath(/);Stringfile=config.getInitParameter(log4j);StringfilePath=prefix+file;Propertiesprops=newProperties();try{FileInputStreamistream=newFileInputStream(filePath);props.load(istream);istream.close();//toPrint(props.getProperty(log4j.appender.file.File));StringlogFile=prefix+props.getProperty(log4j.appender.file.File);//设置路径props.setProperty(log4j.appender.file.File,logFile);PropertyConfigurator.configure(props);//装入log4j配置信息}catch(IOExceptione){toPrint(Couldnotreadconfigurationfile[+filePath+].);toPrint(Ignoringconfigurationfile[+filePath+].);return;}}publicstaticvoidtoPrint(Stringcontent){System.out.println(content);}}实际上log4j的配置文件log4j.properties如为默认名,可放置在JVM能读到的classpath里的任意地方,一般是放在WEB-INF/classes目录下。当log4j的配置文件不再是默认名,则需要另外加载并给出参数,如上“ropertyConfigurator.configure(props);//装入log4j配置信息”(2).Web.xml中的配置servletservlet-namelog4j-init/servlet-nameservlet-classLog4jInit/servlet-classinit-paramparam-namelog4j/param-nameparam-valueWEB-INF/classes/log4j.properties/param-value/init-paramload-on-startup1/load-on-startup/servlet注意:上面的load-on-startup设为0,以便在Web容器启动时即装入该Servlet。log4j.properties文件放在根的properties子目录中,也可以把它放在其它目录中。应该把.properties文件集中存放,这样方便管理。(3).log4j.properties中即可配置log4j.appender.file.File为当前应用的相对路径.以上是网上log4j日志文件的相对路径配置的三种方法(我能找到的就三种),分析:方法一主要是扩展了log4j的RollingFileAppender类,其他的FileAppender同样道理。扩展的方法,就是用一个子类去覆盖setFile方法,这个方法在log4j读取配置文件生成appender的时候调用,传入的就是配置文件中的路径,这样我就可以按照自己的想法在路径前面加上根路径了。这种方法可以在log4j.properties中用相对路径自由配置log4j.appender.A1.File属性来决定生成的日志相对web应用根目录的位置。方法二是利用服务器vm中已经存在的环境变量如${catalina.home}来设置相对于${catalina.home}的日志路径,日志只能放到服务器子目录里,而且如果是用的其它服务器,则要改对应的环境变量。此方法平台移植不方便。方法三是扩展ActionServlet类,覆盖其init()方法,新方法中载入log4j.properties位置的参数,可以自由配置log4j的配置文件的名字和存放位置。也可自由配置log4j日志文件的相对于当前应用的路径。详细代码如下:packagewbb.bysxxglxt.util;importorg.apache.struts.action.*;importorg.apache.commons.logging.LogFactory;importorg.apache.commons.logging.Log;importjavax.servlet.ServletException;importjava.util.Properties;importjava.io.InputStream;importorg.apache.log4j.PropertyConfigurator;importjava.io.FileInputStream;importjava.io.IOException;publicclassExtendedActionServletextendsActionServlet{privateLoglog=LogFactory.getLog(this.getClass().getName());publicExtendedActionServlet(){}publicvoidinit()throwsServletException{log.info(Initializing,MyMyActionServletinitthisSystem'sConstVariable);Stringprefix=this.getServletConfig().getServletContext().getRealPath(/);Stringfile=this.getServletConfig().getInitParameter(log4j);StringfilePath=prefix+file;Propertiesprops=newProperties();System.out.println(prefix);System.out.println(file);System.out.println(filePath);try{FileInputStreamlog4jStream=newFileInputStream(filePath);props.load(log4jStream);log4jStream.close();StringlogFile=prefix+props.getProperty(log4j.appender.A1.File);//设置路径System.out.println(logFile);props.setProperty(log4j.appender.A1.File,logFile);PropertyConfigurator.configure(props);//装入log4j配置信息}catch(IOExceptione){e.printStackTrace();}log.info(Initializing,endMyInit);super.init();//应用了struts,此方法不能省,ActionServlet覆盖了的此方法中有很多重要操作}}**********************应用web.xml关键部分***************************servletservlet-nameaction/servlet-nameservlet-classwbb.bysxxglxt.util.ExtendedActionServlet/servlet-classinit-paramparam-nameconfig/param-nameparam-value/WEB-INF/struts-config.xml/param-value/init-paraminit-paramparam-namelog4j/param-nameparam-valueproperties\log4j.properties/param-value/init-paraminit-paramparam-namedebug/param-nameparam-value0/param-value/init-paraminit-paramparam-nameapplication/param-nameparam-valueApplicationResources/param-value/init-paramload-on-startup0/load-on-startup/servletservlet-mappingservlet-name