为了让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.29\webapps\UpLoadAndDownLoad\] instead of [D:\apache-tomcat-6.0.29\webapps\w\] - 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. <!--由Sprng载入的Log4j配置文件位置-->
  7. <context-param>
  8. <param-name>log4jConfigLocation</param-name>
  9. <param-value>/WEB-INF/log4j.properties</param-value>
  10. </context-param>
  11. <!--Spring默认刷新Log4j配置文件的间隔,单位为millisecond-->
  12. <context-param>
  13. <param-name>log4jRefreshInterval</param-name>
  14. <param-value>60000</param-value>
  15. </context-param>
  16. <!-- Web 项目 Spring 加载 Log4j 的监听 -->
  17. <listener>
  18. <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  19. </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-INF\logs\log4j.log (系统找不到指定的路径。)

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

Log4j 配置 的webAppRootKey参数问题的更多相关文章

  1. [转] Log4j 配置 的webAppRootKey参数问题

    在tomcat下部署两个或多个项目时,web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为“webapp.root”,如下:<!-- 应用路径 --> < ...

  2. tomcat中部署多个项目,webAppRootKey 参数配置

    在一个tomcat中部署多个项目时,需要在每个项目的web.xml中配置webAppRootKey参数,如下: <context-param> <param-name>webA ...

  3. log4j配置参数详解——按日志文件大小、日期切分日志文件

    项目中尽管对log4j有基本的配置,例如按天生成日志文件以作区分,但如果系统日志文件过大,则就需要考虑以更小的单位切分或者其他切分方式.下面就总结一下log4j常用的配置参数以及切分日志的不同方式. ...

  4. log4j - 输出格式控制, PatternLayout参数含义以及详细配置

    转载自:https://blog.csdn.net/reserved_person/article/details/52849505 做项目被log4j的输出格式化参数搞烦了,索性把API的相关部分大 ...

  5. Spring的Log4J配置器Log4jWebConfigurer介绍

    1. Logj4简介 Log4j是Apache大旗下的一个子项目,它可以用来重定向应用日志文件的输出流,无论我们想将日志文件输出到控制台还是网络还是其他地方,都可以通过logj4来配置,如果我们的应用 ...

  6. log4j配置详解

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...

  7. 使用log4j配置不同文件输出不同内容

    敲代码中很不注意写日志,虽然明白很重要.今天碰到记录日志,需要根据内容分别输出到不同的文件. 参考几篇文章: 感觉最详细:http://blog.csdn.net/azheng270/article/ ...

  8. log4j配置日志文件log4j.appender.R.File相对路径方法

    方法一. 解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如:log4j.appender.logfile.File=${WORKDIR}/logs ...

  9. Log4j配置详解及不同的包(package)下的日志写入到不同的日志文件下

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt262 以下都是log4j.properties要写入的内容: 一:参数介绍: ...

随机推荐

  1. 任务太多,时间太少,GT凶猛,不留情面啊。。。

    最近由于提高了发现资料的效率及方法,于是得到了很多好的资料,也打印了好多资料!可是,我突然发现自己好像要做的事太多了,一时间没有了头绪.今天花点时间写个博客,整理一下最近杂乱的状态,看看到底该如何调配 ...

  2. 加载json文件没显示图片

    IOS 9新特性要求App内访问的网络必须使用HTTPS协议. 但是现在公司的项目使用的是HTTP协议,使用私有加密方式保证数据安全.现在也不能马上改成HTTPS协议传输. 以下解决办法: 在info ...

  3. c#防止多次运行代码收集

    1.原文:经过我的测试,还比较好用,但是有个问题,如果不注销,用另一个用户进入,则程序不能判断出已运行.所以只限于用在单用户环境,还是不太完美. class Program { [STAThread] ...

  4. C#中的async和await

    其实这两个关键字的功效比之前的异步方法调用有一个好处,那就是异步阻塞的方法可以有返回值.之前都是通过回调函数实现,执行上下文会切换,不过和这个执行过程类似.可以对这两个关键字这么理解:遇到async的 ...

  5. thrift demo

    基于上一篇博客,安装thrift complier之后,就需要进行跑跑程序,来看看是否如同预期的那种效果. 前面的thrift compiler的主要作用,其实就是为了IDL的,就是防止客户端和服务端 ...

  6. C# 给某个方法设定执行超时时间 C#如何控制方法的执行时间,超时则强制退出方法执行 C#函数运行超时则终止执行(任意参数类型及参数个数通用版)

    我自己写的 /// <summary> /// 函数运行超时则终止执行(超时则返回true,否则返回false) /// </summary> /// <typepara ...

  7. OpenCV GPU CUDA OpenCL 配置

    首先,正确安装OpenCV,并且通过测试. 我理解GPU的环境配置由3个主要步骤构成. 1. 生成关联文件,即makefile或工程文件 2. 编译生成与使用硬件相关的库文件,包括动态.静态库文件. ...

  8. HTML5外包团队-技术分享【使用HTML5的VIDEO标记播放RTSP视频流】

    使用HTML5的VIDEO播放RTSP实时视频流源代码: <!DOCTYPE html> <html><head> <meta http-equiv=&quo ...

  9. Android AChartEngine 去除折线图黑边

    通常使用AChartEngine画出的折线图,如果背景不是黑色,则会在折线图的坐标轴旁边出现黑边,如图所示: 试了好多设置,最后终于发现,去除黑边的设置是: mRenderer.setMarginsC ...

  10. ASP.net 关于TextBox的TextMode=“PassWord”时的动态赋值

    1.在界面创建一个新的TBPwdTemp并设置TextMode=“SingleLine”,visible=“false”,将数据库密码值传给该TextBox: 2.然后分别用 this.TBPwd.A ...