log4j高级技巧--动态配置日志输出文件的位置

og4j高级技巧--动态配置日志输出文件的位置

    log4j的通常用法就是通过在其配置文件(xml或properties)中直接将输出文件写死,在很多情况下,这样做是非常简单而又有效的。但这样做的缺点是,如果想让这个web应用运行起来,必须要修改log4j的配置文件。比如struts2.x中log4j的配置,每个人都得按照自己的路径进行配置。这无疑增加了配置的复杂性。因此,在某些情况下,我们更希望日志文件默认就输出到web应用的某个目录里,比如如果想输出日志到webroot/logs/log.log中,这该如何实现呢?

    在配置文件中(我是在properties文件中使用的,xml我未测试,理论上一样)使用${user.dir}类似的方式,这里变量必须是System.getPropertities里的变量。而我们则就是要利用这一点。首先在一个Listener里或高优先级、自启动的Servlet里获得应用的发布目录,这是很容易得到的,比如String home = servletContext.getRealPath("/");然后调用System.setPropertity("web_home",home),“web_home”名字可以随意。则log4j.properties里的配置为:log4j.appender.TRACE.File=${web_home}/logs/log.log.则日志会输出到web应用发布目录里的logs目录里。



==============================

from : http://www.blogjava.net/hello-yun/archive/2012/07/29/384259.html

通常在项目中我们都会把log4j的配置放到classpath里,
log4j的输出路径也就直接写在log4j.xml或log4j.properties中了,
原本就这样了不用麻烦什么了,可是在我们公司什么都要配置分离。
所以 log4j的输出目录也就不再开发人员指定了,
那么如何做到分离呢。
有的是直接把log4j.xml或properties文件分离,在项目启动时加载进来,
那么这样一来 整个log4j的配置文件都不由开发人员控制,
可是通常log4j的配置由运维人员配置的东东也就一个输出目录了,
而log4j的其它配置还是由开发人员控制,
这时可以用${},来指定

log4j.home由容器启动时指定,jvm中加上   -Dlog4j.home=D:/log
这样在Log4j.xml中的${log4j.home}就知道了实际的输出目录了,
同样也可以把这个log4j.home放到分离的properties中,这时候可以
在容器启动时在监听器来解析properties,获取到log4j.home变量后
把值设置到system.env中
System.setProperties("log4j.home");
这样一来 ,log4j一样可以找到输出目录



你可能感兴趣的:(Java,积累)