• Log4j 配置 的webAppRootKey参数问题


    为了让Web项目中的Spring 使用Log4j做如下配置:

    1、在web.xml中添加如下内容:

    <!--如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的"webapp.root"。但最好设置,以免项目之间的名称冲突。

    如我这里有两个项目都在web.xml都没配置webAppRootKey,那么这两个项目发布到tomcat时就会出现如下的异常:

    Xml代码  
    1. 严重: Exception sending context initialized event to listener instance of class org.springframework.web.util.Log4jConfigListener  
    2. java.lang.IllegalStateException: Web app root system property already set to different value: 'webapp.root' = [D:apache-tomcat-6.0.29webappsUpLoadAndDownLoad] instead of [D:apache-tomcat-6.0.29webappsw] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!  
    3.     at org.springframework.web.util.WebUtils.setWebAppRootSystemProperty(WebUtils.java:146)  
    4.     at org.springframework.web.util.Log4jWebConfigurer.initLogging(Log4jWebConfigurer.java:118)  
    5.     at org.springframework.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.java:47)  
    6.     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)  
    7.     at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)  
    8.     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)  
    9.     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)  
    10.     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)  
    11.     at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1041)  
    12.     at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:964)  
    13.     at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)  
    14.     at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)  
    15.     at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)  
    16.     at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)  
    17.     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)  
    18.     at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)  
    19.     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)  
    20.     at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)  
    21.     at org.apache.catalina.core.StandardService.start(StandardService.java:519)  
    22.     at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)  
    23.     at org.apache.catalina.startup.Catalina.start(Catalina.java:581)  
    24.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
    25.     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)  
    26.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
    27.     at java.lang.reflect.Method.invoke(Unknown Source)  
    28.     at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)  
    29.     at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)  
    30. 2010-10-10 17:18:18 org.apache.catalina.core.StandardContext start  
    31. 严重: Error listenerStart  

    所以对多个项目要对webAppRootKey进行配置,这里主要是让log能将日志写到对应项目根目录下,如我配置这两个项目的webAppRootKey为

    Xml代码  
    1. <!-- 应用路径  -->  
    2.     <context-param>  
    3.         <param-name>webAppRootKey</param-name>  
    4.         <param-value>spring.webapp.root</param-value>  
    5.     </context-param>  
    Xml代码  
    1. <!-- 应用路径  -->  
    2.     <context-param>  
    3.         <param-name>webAppRootKey</param-name>  
    4.         <param-value>spring.webapp.root2</param-value>  
    5.     </context-param>  

     

    这样就不会出现冲突了。


    定义以后,在Web Container启动时将把ROOT的绝对路径写到系统变量里。
    然后log4j的配置文件里就可以用${webName.root }来表示Web目录的绝对路径,把log文件存放于webapp中。

    Xml代码  收藏代码
    1. <!--此参数用于后面的“Log4jConfigListener”-->  
    2. <context-param>  
    3. <param-name>webAppRootKey</param-name>  
    4. <param-value>webName.root</param-value>  
    5. </context-param>  
    6.   
    7. <!--由Sprng载入的Log4j配置文件位置-->  
    8. <context-param>  
    9. <param-name>log4jConfigLocation</param-name>  
    10. <param-value>/WEB-INF/log4j.properties</param-value>  
    11. </context-param>  
    12.   
    13. <!--Spring默认刷新Log4j配置文件的间隔,单位为millisecond-->  
    14. <context-param>  
    15. <param-name>log4jRefreshInterval</param-name>  
    16. <param-value>60000</param-value>  
    17. </context-param>  
    18.   
    19. <!-- Web 项目 Spring 加载 Log4j 的监听 -->  
    20. <listener>  
    21. <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
    22. </listener>  

     

    2、编写log4j.properties属性文件,使用web.xml配置的全局变量:

    log4j.appender.A_default.File=${webName.root}/WEB-INF/logs/log4j.log

    详细内容略。

    问题:
    如上配置后,log4j.properties属性文件的存放位置,应在Web项目中的WEB-INF下,而不是默认的/WEB-INF/classes下。
    可在做spring 的单元测试时,默认读取classes下的log4j.properties,不知该问题如何解决?

    如果把log4j.properties存放在/WEB-INF/classes/log4j.properties下的话,会在启动Tomcat时报错:

    log4j:ERROR setFile(null,true) call failed.
    java.io.FileNotFoundException: WEB-INFlogslog4j.log (系统找不到指定的路径。)

    可在WEB-INFlogslog4j.log 却可以看到log4j.log文件已存在Spring的日志输出信息。
    分析可能是其他的类在加载log4j.properties时,无法读取${webName.root}变量的值。

  • 相关阅读:
    JavaScript中DOM的层次节点(一)
    JS可维护性代码
    Angular页面加载闪现解决方案 ng-cloak
    无法向会话状态服务器发出会话状态请求。
    算法题--拓扑排序
    2020年04月25日个人赛
    Educational Codeforces Round 86 (Rated for Div. 2)
    博弈--巴什博弈
    2020年04月19日个人赛
    AtCoder Beginner Contest 163(D)
  • 原文地址:https://www.cnblogs.com/huqianliang/p/5650971.html
Copyright © 2020-2023  润新知