log4j日志文件相对路径保存几种方法

发布时间:2019-11-23编辑:脚本学堂
这里介绍了log4j日志文件按相对路径保存的几种方法,Log4j日志输出路径只能设定成绝对路径,对程序与项目管理不是很方便,可以参考这里的方法加以修改。

在log4j日志文件配置中,Log4j日志输出路径默认只能设定成绝对路径,这在有着多种不同类型的日志文件的项目中,会带来很多麻烦。

比如,设定日志保存在webapp/log。

方法一,扩展了log4j的RollingFileAppender类,其他的FileAppender同样道理。

扩展的方法,就是用一个子类去覆盖setFile方法,这个方法在log4j读取配置文件生成appender的时候调用,传入的就是配置文件中的路径,这样即可在路径前面加上根路径了。
这种方法可以在log4j.properties中用相对路径自由配置log4j.appender.A1.File属性来决定生成的日志相对web应用根目录的位置。

方法二,利用服务器vm中已经存在的环境变量如${catalina.home}来设置相对于${catalina.home}的日志路径,日志只能放到服务器子目录里,而且如果是用的其它服务器,则要改对应的环境变量。此方法平台移植不方便。

方法三,扩展ActionServlet类,覆盖其init()方法,新方法中载入log4j.properties位置的参数,可以自由配置log4j的配置文件的名字和存放位置。
也可自由配置log4j日志文件的相对于当前应用的路径。

对于第三个方法,作者提出了个问题:
log4j配置文件的位置,不让其在web-inf/classes目录,因为在加载此Servlet之前,服务器如tomcat启动时会自动搜索web-inf目录和web-inf/classes目录中log4j.properties文件,如有则自动加载。log4j属性文件加载后,由于该属性文件中log4j.appender.A1.File的值用的是相对路径,自动加载配置便会出错:
 

log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: WEB-INFlogsbysxxglxt.log


(系统找不到指定的路径。)

尽管后面加载扩展的ActionServlet中正确设置了log4j属性文件并正常加载了,但还是报的这个错。
只有更改log4j属性文件名字或者更改其存放位置,让其不能自动加载了,不过还是有两个警告:
 

log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax).
log4j:WARN Please initialize the log4j system properly.

新的发现:
由于spring也会加载log4j.properties,如果加载不到就往控制台打log信息,总觉得有些碍眼,于是想办法去掉。
Spring提供了一个Log4jConfigListener,本身就能通过web.xml中配置来指定位置加载log4j配置文件和log输出路径,注意该listener需要放在spring的Listener之前。

事实上,Log4jConfigListener更适合log4j在web工程中使用,原因如下:
1、动态的改变记录级别和策略,不需要重启Web应用,如《Effective Enterprise Java》所说。
2、把log文件定在 /WEB-INF/logs/ 而不需要写绝对路径。
因为 系统把web目录的路径压入一个叫webapp.root的系统变量。这样写log文件路径时不用写绝对路径了.
 

log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/myfuse.log

3、可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path。

4、log4jRefreshInterval为60000表示 开一条watchdog线程每60秒扫描一下配置文件的变化;
在web.xml 添加:
 

<context-param> 
    <param-name>log4jConfigLocation</param-name> 
    <param-value>WEB-INF/log4j.properties</param-value> 
</context-param> 
<context-param> 
    <param-name>log4jRefreshInterval</param-name> 
    <param-value>60000</param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener>