Log4j 配置 的webAppRootKey参数问题
为了让Web项目中的Spring 使用Log4j做如下配置:
1、在web.xml中添加如下内容:
<!--如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的"webapp.root"。但最好设置,以免项目之间的名称冲突。
如我这里有两个项目都在web.xml都没配置webAppRootKey,那么这两个项目发布到tomcat时就会出现如下的异常:
- 严重: Exception sending context initialized event to listener instance of class org.springframework.web.util.Log4jConfigListener
 - 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!
 - at org.springframework.web.util.WebUtils.setWebAppRootSystemProperty(WebUtils.java:146)
 - at org.springframework.web.util.Log4jWebConfigurer.initLogging(Log4jWebConfigurer.java:118)
 - at org.springframework.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.java:47)
 - at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
 - at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
 - at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
 - at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
 - at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
 - at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1041)
 - at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:964)
 - at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
 - at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
 - at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
 - at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
 - at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
 - at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
 - at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 - at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
 - at org.apache.catalina.core.StandardService.start(StandardService.java:519)
 - at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
 - at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
 - at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 - at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 - at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 - at java.lang.reflect.Method.invoke(Unknown Source)
 - at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
 - at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
 - 2010-10-10 17:18:18 org.apache.catalina.core.StandardContext start
 - 严重: Error listenerStart
 
所以对多个项目要对webAppRootKey进行配置,这里主要是让log能将日志写到对应项目根目录下,如我配置这两个项目的webAppRootKey为
- <!-- 应用路径 -->
 - <context-param>
 - <param-name>webAppRootKey</param-name>
 - <param-value>spring.webapp.root</param-value>
 - </context-param>
 
- <!-- 应用路径 -->
 - <context-param>
 - <param-name>webAppRootKey</param-name>
 - <param-value>spring.webapp.root2</param-value>
 - </context-param>
 
这样就不会出现冲突了。
定义以后,在Web Container启动时将把ROOT的绝对路径写到系统变量里。
然后log4j的配置文件里就可以用${webName.root }来表示Web目录的绝对路径,把log文件存放于webapp中。
- <!--此参数用于后面的“Log4jConfigListener”-->
 - <context-param>
 - <param-name>webAppRootKey</param-name>
 - <param-value>webName.root</param-value>
 - </context-param>
 - <!--由Sprng载入的Log4j配置文件位置-->
 - <context-param>
 - <param-name>log4jConfigLocation</param-name>
 - <param-value>/WEB-INF/log4j.properties</param-value>
 - </context-param>
 - <!--Spring默认刷新Log4j配置文件的间隔,单位为millisecond-->
 - <context-param>
 - <param-name>log4jRefreshInterval</param-name>
 - <param-value>60000</param-value>
 - </context-param>
 - <!-- Web 项目 Spring 加载 Log4j 的监听 -->
 - <listener>
 - <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
 - </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参数问题的更多相关文章
- [转] Log4j 配置 的webAppRootKey参数问题
		
在tomcat下部署两个或多个项目时,web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为“webapp.root”,如下:<!-- 应用路径 --> < ...
 - tomcat中部署多个项目,webAppRootKey 参数配置
		
在一个tomcat中部署多个项目时,需要在每个项目的web.xml中配置webAppRootKey参数,如下: <context-param> <param-name>webA ...
 - log4j配置参数详解——按日志文件大小、日期切分日志文件
		
项目中尽管对log4j有基本的配置,例如按天生成日志文件以作区分,但如果系统日志文件过大,则就需要考虑以更小的单位切分或者其他切分方式.下面就总结一下log4j常用的配置参数以及切分日志的不同方式. ...
 - log4j - 输出格式控制, PatternLayout参数含义以及详细配置
		
转载自:https://blog.csdn.net/reserved_person/article/details/52849505 做项目被log4j的输出格式化参数搞烦了,索性把API的相关部分大 ...
 - Spring的Log4J配置器Log4jWebConfigurer介绍
		
1. Logj4简介 Log4j是Apache大旗下的一个子项目,它可以用来重定向应用日志文件的输出流,无论我们想将日志文件输出到控制台还是网络还是其他地方,都可以通过logj4来配置,如果我们的应用 ...
 - log4j配置详解
		
Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...
 - 使用log4j配置不同文件输出不同内容
		
敲代码中很不注意写日志,虽然明白很重要.今天碰到记录日志,需要根据内容分别输出到不同的文件. 参考几篇文章: 感觉最详细:http://blog.csdn.net/azheng270/article/ ...
 - log4j配置日志文件log4j.appender.R.File相对路径方法
		
方法一. 解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如:log4j.appender.logfile.File=${WORKDIR}/logs ...
 - Log4j配置详解及不同的包(package)下的日志写入到不同的日志文件下
		
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt262 以下都是log4j.properties要写入的内容: 一:参数介绍: ...
 
随机推荐
- js窗口边缘滑入滑出效果-初级代码
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - 【转载】知乎答案----孙志岗----Google 发布了程序员养成指南,国内互联网巨头是否也有类似的指南和课程推荐
			
国内公司在复制国外商业模式的同时,也应复制人家的社会担当.所以,来答题了!就参考 Google 的框架,列一下中文的课程.大体上在线学完一个计算机专业,是基本不成问题的.但是,这不意味着你可以不上大学 ...
 - 快速判断ie10及以上版本浏览器
			
if (!(/msie [6|7|8|9]/i.test(navigator.userAgent))){ //ie10以上 }; 快速判断ie10及以上版本浏览器
 - 数据库update死锁
			
比较常见的死锁场景,并发批量update时的一个场景: update cross_marketing set gmtModified = NOW(), pageview = pageview+ #ex ...
 - ODOO 源代码安装要求
			
ODOO 源代码安装要求 ref:http://www.odoo.com/documentation/10.0/setup/install.html#setup-install-source pyth ...
 - AndroidStudio 中的坑Error:(1, 0) Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRID
			
将 build.gradle 中 的 classpath改为2.0.+ dependencies { classpath 'com.android.tools.build:gradle:2.0.+'然 ...
 - android学习笔记50——SQLiteOpenHelper、android实现系统自带样式
			
SQLiteOpenHelper SQLiteOpenHelper是android提供的一个管理数据库的工具类,可用于管理数据库的创建和版本更新. 一般的用法是创建SQLiteOpenHelper的子 ...
 - OAF_文件系列5_实现OAF解析XML文件javax.xml.parsers(案例)
			
20150729 Created By BaoXinjian
 - GC之六--SystemGC完全解读
			
概述 JVM的GC一般情况下是JVM本身根据一定的条件触发的,不过我们还是可以做一些人为的触发,比如通过jvmti做强制GC,通过System.gc触发,还可以通过jmap来触发等,针对每个场景其实我 ...
 - SQL Error (1130): Host '192.168.1.126' is not allowed to connect to this MySQL server
			
通过HeidiSQL连接MYSQL数据库报错: SQL Error (1130): Host '192.168.1.126' is not allowed to connect to this MyS ...