为了实现日志输出目录的动态配置,今天看了一下Spring中的相关代码,发现使用一个
Servlet
Listener,在Tomcat启动时把ROOT的绝对路径写到系统变量里,这样log4j的配置文件里就可以用${myApp.root}来表示刚刚
设进去的系统变量,具体如下:
(1) 在web.xml中加入如下配置:
<!--
将当前的应用root设置到系统变量中
-->
<
context-param
>
<
param-name
>
webAppRootKey
</
param-name
>
<
param-value
>
myApp.root
</
param-value
>
</
context-param
>
<
context-param
>
<
param-name
>
log4jConfigLocation
</
param-name
>
<
param-value
>
WEB-INF/log4j.xml
</
param-value
>
</
context-param
>
...
<
listener
>
<
listener-class
>
将当前的应用root设置到系统变量中
-->
<
context-param
>
<
param-name
>
webAppRootKey
</
param-name
>
<
param-value
>
myApp.root
</
param-value
>
</
context-param
>
<
context-param
>
<
param-name
>
log4jConfigLocation
</
param-name
>
<
param-value
>
WEB-INF/log4j.xml
</
param-value
>
</
context-param
>
...
<
listener
>
<
listener-class
>
org.springframework.web.util.Log4jConfigListener
</
listener-class
>
</
listener
>
说明:
Log4jConfigListener中的initLogging方
法会将系统的ROOT的绝对路径设置到系统变量中,默认是设置到webapp.root,但是如果多个系统都用这个默认的变量就会覆盖了,因此在这里定义
了myApp.root,防止与其他系统冲突。
(2) 在log4j.xml中如下配置:
<
appender
name
="PROJECT"
class
="org.apache.log4j.FileAppender"
>
<
param
name
="file"
value
="${myApp.root}/logs/mylog.log"
/>
<
param
name
="append"
value
="false"
/>
<
param
name
="encoding"
value
="utf-8"
/>
<
layout
class
="org.apache.log4j.PatternLayout"
>
<
param
name
="ConversionPattern"
value
="%d [%t] %p - %m%n"
/>
</
layout
>
appender
name
="PROJECT"
class
="org.apache.log4j.FileAppender"
>
<
param
name
="file"
value
="${myApp.root}/logs/mylog.log"
/>
<
param
name
="append"
value
="false"
/>
<
param
name
="encoding"
value
="utf-8"
/>
<
layout
class
="org.apache.log4j.PatternLayout"
>
<
param
name
="ConversionPattern"
value
="%d [%t] %p - %m%n"
/>
</
layout
>
</
appender
>
这样就可以实现日志输出目录的动态配置了!
(3)
注意:要将log4j.xml放在WEB-INF目录下面,如果放在通常的classes下面的话会有一个问题,当Tomcat启动的时候,Log4j会
到classes下面去找这个配置 文件,然后因为这时候还米有设置系统变量,那么就会报找不到对应文件的错误了!但其实这个错误是不会影响接下来的功
能,就是为了避免出现这个异常将配置文件放到WEB-INF下面。