在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的值用的是相对路径,自动加载配置便会出错:
(系统找不到指定的路径。)
尽管后面加载扩展的ActionServlet中正确设置了log4j属性文件并正常加载了,但还是报的这个错。
只有更改log4j属性文件名字或者更改其存放位置,让其不能自动加载了,不过还是有两个警告:
新的发现:
由于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文件路径时不用写绝对路径了.
3、可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path。
4、log4jRefreshInterval为60000表示 开一条watchdog线程每60秒扫描一下配置文件的变化;
在web.xml 添加: