spring的log4j listener(webAppRootKey)

原创 2012年03月22日 22:01:00

http://blog.csdn.net/pengchua/article/details/1943461

使用spring中的Log4jConfigListener有如如下好处:
   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> 

 

 

===========

<context-param>
  <param-name>log4jConfigLocation</param-name>
  <param-value>classpath:resource/properties/log4j.properties</param-value>
 </context-param>

<listener>
  <listener-class>
   org.springframework.web.util.Log4jConfigListener
  </listener-class>
 </listener>

=================http://blog.csdn.net/hwctl/article/details/1719597

web.xml中关于log4j的设置及范例说明

分类: 小资料 5984人阅读 评论(1) 收藏 举报
在web.xml有几个条目和log4j有关,它们是: 
  1. 1.
  2. <context-param>
  3.         <param-name>webAppRootKey</param-name>
  4.         <param-value>petclinic.root</param-value>
  5. </context-param>


  6. 2.
  7. <context-param>
  8.         <param-name>log4jConfigLocation</param-name>
  9.         <param-value>/WEB-INFclasseslog4j.properties</param-value>
  10. </context-param>




  11. 3.(该条目在petclinic中被注释掉了)
  12. <listener>
  13.    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  14. </listener>



我们知道,在web-application中使用log4j,有很多配置方式:
a.
用servlet或者ServletContextListener对log4j做配置。通常,你不需要亲自编写servlet或者 listener,比如直接利用log4j的com.apache.jakarta.log4j.Log4jInit类,Spring的 org.springframework.web.util.Log4jConfigServlet和 org.springframework.web.util.Se
rvletContextListener,这种方式配置灵活,可以通过参数条目自行指定log4j.properties的位置。

b.
把log4j 的默认配置文件(log4j.properties)放在classpath中,通常是/web-inf/classes目录下.这种方式是log4j的 默认配置方式,无须其他配置。缺点就是无法灵活的通过配置文件来指定log4j.properties的文件位置。在我们的petclinic项目中,因 为listener条目被注释,所以采用的也是这种缺省方式。


现在我们考虑listener条目没有被注释的情况,这种情况和注册Log4jConfigServlet的目的是一样的,只是必须在支持listener的servlet container中使用。

找 到.Log4jConfigServlet和ServletContextListener的源码,他们都在适当的地方 (callback method)调用了Log4jWebConfigurer.initLogging(getServletContext()); 定位到这个方法,第一句就是:WebUtils.setWebAppRootSystemProperty(servletContext);再定位到该 方法,方法很短:





  1. public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException {
  2.         String param = servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM);
  3.         String key = (param != null ? param : DEFAULT_WEB_APP_ROOT_KEY);
  4.         String oldValue = System.getProperty(key);
  5.         if (oldValue != null) {
  6.             throw new IllegalStateException("WARNING: Web app root system property already set: " + key + " = " +
  7.                                                                 

  8.             oldValue + " - Choose unique webAppRootKey values in your web.xml files!");
  9.         }
  10.         String root = servletContext.getRealPath("/");
  11.         if (root == null) {
  12.             throw new IllegalStateException("Cannot set web app root system property when WAR file is not 

  13. expanded");
  14.         }
  15.         System.setProperty(key, root);
  16.         servletContext.log("Set web app root system property: " + key + " = " + root);
  17.     }




从代码看出,该方法其实就是把该web application的根目录的绝对文件路径作为属性保存在 System的属性列表中。该属性的名字,由web.xml文件中的名为"webAppRootKey"的参数值指出。如果不在web.xml中定义 webAppRootKey参数,那么属性名就是缺省的"webapp.root".在我们的petclinic项目中已经定义了 webAppRootKey参数,其值为"petclinic.root",因此,属性的名字就是"petclinic.root".

再 回到Log4jWebConfigurer.initLogging(getServletContext()),接下来的行为是从web.xml中获取 log4jConfigLocation和log4jRefreshInterval.前者指出log4j配置文件(有可能是xml格式)的位置和名字, 后者则指出重新都取配置文件的时间间隔.然后调用Log4jConfigurer.initLogging()方法对log4j做配置。从 Log4jConfigurer.initLogging()方法我们可以看到,针对不同格式的配置文件(properties或者xml), Log4jConfigurer采用不同的lo4j configurator类做配置,例如DOMConfigurator或者 PropertyConfigurator。

至此,关于petclinic中关于log4j的配置,我们已经基本上弄清楚了。可是System对象中的
petclinic.root属性在什么时候使用呢?在web-inf/classes下面的log4j.properties文件中,有这么一句:
log4j.appender.logfile.File=${petclinic.root}/WEB-INF/petclinic.log
这 样,我们就用上了petclinic.root属性了。从上面的分析可知,如果你不在web.xml中定义webAppRootKey参数,那么你就得把 log4j.appender.logfile.File=${petclinic.root}/WEB-INF/petclinic.log
中的petclinic.root变量改为webapp.root变量或者干脆换成别的绝对路径了。 

 

Listener 监听器&&Spring使用Log4jConfigListener配置Log4j日志

Listener 监听器     前言:之前写了一篇关于Filter的文章:http://www.cnblogs.com/hellojava/archive/2012/12/19/2824...
  • w938706428
  • w938706428
  • 2014年12月10日 14:40
  • 6992

springMVC项目在jboss7中配置应用自己的log4j

Jboss7默认采用容器自己的log4j module,应用自己配置的log4j不起作用,需要应用做一些设置: 以springMVC项目为例: 1> 在WEB-INF下新建文件jboss-depl...
  • sundongsdu
  • sundongsdu
  • 2013年07月17日 11:19
  • 3193

webAppRootKey作用

log4j是很好用的一个工具,在目前的WEB项目中经常使用。配上jakarta的common logging和Eclipse的插件Log4E很好用。 不过还是有几个不太方便的地方: 1 Log...
  • liangyue1994
  • liangyue1994
  • 2015年12月02日 14:40
  • 4769

Log4j 配置spring 的webAppRootKey参数问题

Log4j 配置 的webAppRootKey参数问题为了让Web项目中的Spring 使用Log4j做如下配置:1、在web.xml中添加如下内容:webAppRootKey参数,那么webAppR...
  • xinew
  • xinew
  • 2010年05月21日 12:02
  • 1254

Spring中Log4j高级配置

Spring对Log4j支持的入口类是一个ServletContextListener。   Log4jConfigListener Log4jWebConfigurer ...
  • dc_726
  • dc_726
  • 2012年12月17日 19:46
  • 5744

logback + spring的webRootKey 多项目同时部署冲突问题

一次部署项目后出现下面的异常:  Java代码   java.lang.IllegalStateException: Web app root system propert...
  • u012576527
  • u012576527
  • 2016年08月18日 16:45
  • 820

log4j 中的 webAppRootKey

通过spring配置log4j的时候,我们常常忽略了log4j的webAppRootKey属性的配置。在不设置配置的时候webAppRootKey的默认值为webapp.root,因为有默认值,所以不...
  • juejiang_yi
  • juejiang_yi
  • 2017年03月21日 08:35
  • 32

Tomcat部署两个webapp时webAppRootKey冲突的问题

SpringMVC容器启动时,WebAppRootListener会将该webapp的项目路径设置到系统全局变量中,以便在可以使用系统全局变量的地方获取到webapp的项目路径,默认该变量名为weba...
  • alanzyy
  • alanzyy
  • 2016年12月20日 13:47
  • 1317

web.xml配置文件中的webAppRootKey作用

web.xml中的片段 webAppRootKey sociality.root 在web.xml文件中要配置上述节点,如果不配置的话,webAppRootKey的值默认值为weba...
  • xinluke
  • xinluke
  • 2016年04月29日 18:04
  • 848

Log4j的使用和怎么在spring中集成log4j

  log4j简介简单的说log4j就是帮助开发人员进行日志输出管理的API类库。它最重要的特点就可以配置文件灵活的设置日志信息的优先级、日志信息的输出目的地以及日志信息的输出格式。Log4j除了可以...
  • GOALSTAR
  • GOALSTAR
  • 2007年08月02日 14:52
  • 20361
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring的log4j listener(webAppRootKey)
举报原因:
原因补充:

(最多只允许输入30个字)