`
teamojiao
  • 浏览: 350405 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Log4j 配置 的webAppRootKey参数问题

阅读更多

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

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

<!--如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的"webapp.root"。但最好设置,以免项目之间的名称冲突。
定义以后,在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}变量的值。

分享到:
评论
2 楼 jactive 2009-09-10  
2. 保持CATALINA的简洁,还是把log4j.jar放到WEB-INF/classes下,不是lib

但是不能让
org.apache.catalina.core.StandardContext.start 中调用了 getLogger时,虽然发现有log4j,
但不让他找到默认的配置文件,这样就不会出现无法解析log4j.properties中的系统变量的问题了,比如
把 log4j.properties改名为 spring-log4j.properties,或者改名为 config/log4j.properties
1 楼 jactive 2009-09-10  
参考这里,可以打开日志 jcl  的日志org.apache.commons.logging.LogFactory.DIAGNOSTICS_DEST_PROPERTY

-Dorg.apache.commons.logging.diagnostics.dest=STDERR

在TOMCAT 5.5.28 中
日志如下:
[LogFactoryImpl@21422977 from sun.misc.Launcher$AppClassLoader@6298545] [ENV] No configuration defined for item org.apache.commons.logging.Log.allowFlawedHierarchy
[LogFactoryImpl@21422977 from sun.misc.Launcher$AppClassLoader@6298545] Trying to get log class from attribute 'org.apache.commons.logging.Log'
[LogFactoryImpl@21422977 from sun.misc.Launcher$AppClassLoader@6298545] Trying to get log class from attribute 'org.apache.commons.logging.log'
[LogFactoryImpl@21422977 from sun.misc.Launcher$AppClassLoader@6298545] Trying to get log class from system property 'org.apache.commons.logging.Log'
[LogFactoryImpl@21422977 from sun.misc.Launcher$AppClassLoader@6298545] Trying to get log class from system property 'org.apache.commons.logging.log'
[LogFactoryImpl@21422977 from sun.misc.Launcher$AppClassLoader@6298545] No user-specified Log implementation; performing discovery using the standard supported logging implementations...
[LogFactoryImpl@21422977 from sun.misc.Launcher$AppClassLoader@6298545] Attempting to instantiate 'org.apache.commons.logging.impl.Log4JLogger'
[LogFactoryImpl@21422977 from sun.misc.Launcher$AppClassLoader@6298545] Trying to load 'org.apache.commons.logging.impl.Log4JLogger' from classloader org.apache.catalina.loader.WebappClassLoader@3658896
[LogFactoryImpl@21422977 from sun.misc.Launcher$AppClassLoader@6298545] Class 'org.apache.commons.logging.impl.Log4JLogger' was found at 'jar:file:/usr/local/apache-tomcat-5.5.28/webapps/petclinic/WEB-INF/lib/commons-logging.jar!/org/apache/commons/logging/impl/Log4JLogger.class'
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: /WEB-INF/petclinic.log (No such file or directory)
at java.io.FileOutputStream.openAppend(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:177)
at java.io.FileOutputStream.<init>(FileOutputStream.java:102)
at org.apache.log4j.FileAppender.setFile(FileAppender.java:290)
at org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:194)
at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:164)
at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:257)
at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:133)
at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:97)
at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:689)
at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:647)
at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:544)
at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:440)
at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:476)
at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:471)
at org.apache.log4j.LogManager.<clinit>(LogManager.java:125)
at org.apache.log4j.Logger.getLogger(Logger.java:105)
at org.apache.commons.logging.impl.Log4JLogger.getLogger(Log4JLogger.java:289)
at org.apache.commons.logging.impl.Log4JLogger.<init>(Log4JLogger.java:109)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.apache.commons.logging.impl.LogFactoryImpl.createLogFromClass(LogFactoryImpl.java:1116)
at org.apache.commons.logging.impl.LogFactoryImpl.discoverLogImplementation(LogFactoryImpl.java:914)
at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:604)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:336)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:704)
at org.apache.catalina.core.ContainerBase.getLogger(ContainerBase.java:381)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4159)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:448)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)


重点的也就是 [LogFactoryImpl@21422977 from sun.misc.Launcher$AppClassLoader@6298545] Trying to load 'org.apache.commons.logging.impl.Log4JLogger' from classloader org.apache.catalina.loader.WebappClassLoader@3658896


这是 catalina 在load webapp时,会在 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4159) 这里 getLogger(),如果 tomcat/common/lib 和  tomcat/common/endore 中没有log4j.jar ,那么



As mentioned above, the web application class loader diverges from the default Java 2 delegation model
(in accordance with the recommendations in the Servlet Specification, version 2.3, section 9.7.2 Web
Application Classloader). When a request to load a class from the web application's WebappX class loader
is processed, this class loader will look in the local repositories first, instead of delegating before
looking. There are exceptions. Classes which are part of the JRE base classes cannot be overriden. For some
classes (such as the XML parser components in J2SE 1.4+), the J2SE 1.4 endorsed feature can be used (
see the common classloader definition above). Last, any JAR containing servlet API classes will be ignored
by the classloader. All other class loaders in Tomcat 5 follow the usual delegation pattern.
也就是 现在本地找,再到上级 classloader找,与常规找法正好相反,看org.apache.catalina.loader.WebappClassLoader#loadClass
所以只要web application(这里是 petclinic)的WEB-INF/lib中包含是否把 log4j.jar,
无论 $CATALINA_HOME/common/lib 或 $CATALINA_HOME/common/endore中是否包含 log4j.jar,
CATALINA在加载petclinic时,由于CATALINA自身使用日志,i.e.
org.apache.catalina.core.StandardContext.start 中调用了 getLogger,并且当前的classloader
是webappclassloader,org.apache.log4j.LogManager的repositorySelector中都不会缓存有
日志,这就会创建日志,而后创建日志的时候默认会从log4j.properties中读取配置信息,
由于petclinic没有加载,所以spring也不会初始化webAppRootKey
所指定的petclinic.root这个System.getProperties,所以会出现问题。避免这个问题的办法:
1. 删除 web application/WEB-INF/lib中的所有 log4j.jar,放到 $CATALINA_HOME/common/lib
或$CATALINA_HOME/common/endore中去,而后在$CATALINA_HOME/common/class 中添加log4j.properties
2. 保持CATALINA的简洁,还是把log4j.jar放到WEB-INF/lib下,但是不能让
org.apache.catalina.core.StandardContext.start 中调用了 getLogger时,虽然发现有log4j,
但不让他找到默认的配置文件,这样就不会出现无法解析log4j.properties中的系统变量的问题了,比如
把 log4j.properties改名为 spring-log4j.properties,或者改名为 config/log4j.properties


可以继续讨论  jactive@126.com

相关推荐

    Log4j 相对路径配置

    2. `&lt;param-name&gt;log4jConfigLocation&lt;/param-name&gt;` 指定了Log4j配置文件的路径,这里是`WEB-INF/config/log4j.properties`。这个配置告诉Web应用在哪里寻找Log4j的配置信息。 3. `&lt;param-name&gt;log4...

    log4j的作用及测试

    1. **log4jConfigLocation**:指定了log4j配置文件的位置,这里设为`/WEB-INF/log4j.properties`。 2. **log4jRefreshInterval**:设定刷新配置文件的时间间隔,单位为毫秒,默认值为60000毫秒即一分钟。 3. **...

    Spring对Log4J的增强.txt

    - **说明**:通过注册`Log4jConfigListener`监听器,可以在应用启动时自动加载Log4J配置,并在配置文件发生变化时自动刷新配置。 #### 三、Log4J配置文件详解 Log4J配置文件通常是`.xml`格式,其中包含了日志输出...

    spring 配置log4j.docx

    5. **log4j配置文件**:在`log4j.properties`文件中,我们可以定义日志级别(如INFO、DEBUG等)、日志输出的目标(如控制台、文件等)以及输出格式。例如,`log4j.rootCategory=INFO, file`设置了日志级别为INFO,并...

    深入浅析java web log4j 配置及在web项目中配置Log4j的技巧

    `log4jRefreshInterval` 参数定义了Log4j配置文件的刷新间隔(以毫秒计),这样可以实现动态更新日志配置,无需重启服务器。 接下来,我们需要创建`log4j.properties`配置文件,定义日志输出的级别、格式和目的地。...

    详解Log4j 日志文件存放位置设置

    通过合理配置Log4j的日志文件存放位置,可以有效地管理日志信息,便于问题定位和系统监控。 需要注意的是,在配置日志文件存放位置的时候,需要考虑到安全性和日志文件的管理策略,避免日志文件过大导致磁盘空间...

    web框架搭建.pdf

    -- log4j配置文件的位置 --&gt; &lt;param-value&gt;/WEB-INF/log4j.properties 3.2 配置log4j.properties文件 在WEB-INF目录中添加log4j.properties文件,内容如下: log4j.rootLogger=DEBUG, A1 log4j.appender.A1=...

    spring框架底层架构[借鉴].pdf

    接下来是 log4j 配置相关的参数,包括 `log4jConfigLocation`、`webAppRootKey` 和 `log4jRefreshInterval` 等。这些参数用于指定 log4j 配置文件的位置、应用程序的根目录和 log4j 配置刷新间隔等。 之后是多个 `...

    基于web项目log日志指定输出文件位置配置方法

    2. **配置Log4j配置文件的位置**:接下来,通过`&lt;context-param&gt;`元素设置`log4jConfigLocation`参数,指明Log4j配置文件的位置。例如,`&lt;param-value&gt;classpath:conf/log4j.xml&lt;/param-value&gt;`表示配置文件位于类...

    web.xml配置解析.pdf

    `webAppRootKey`参数用于设置应用的根目录键,Log4jConfigListener则会在启动时寻找log4j.properties或log4j.xml配置文件,从而初始化日志系统。 5. **Struts2与Spring整合** 当Struts2和Spring整合时,通常需要...

    web.xml配置解析[总结].pdf

    `Log4jConfigListener`用于初始化Log4j的日志配置。例如,可以通过以下方式在`web.xml`中配置: ```xml &lt;param-name&gt;webAppRootKey &lt;param-value&gt;your.app.name &lt;listener-class&gt;org.springframework....

    关于red5配置详解

    - `log4jConfigLocation`: 日志配置文件的位置,例如`/WEB-INF/log4j.properties`,用于设置日志记录行为。 - `webAppRootKey`: 应用的全局唯一标识,例如`/myapp`,用于识别和访问特定的应用程序。 3. Context配置...

    red5 配置详解

    - `log4jConfigLocation`:设置日志系统的路径,通常为"/WEB-INF/log4j.properties"。 - `webAppRootKey`:应用程序的唯一名称。 4. **控制配置文件**:每个应用程序的控制配置文件至少包含三种Bean: - **...

    RED5安装与配置.doc

    5. **log4jConfigLocation**:定义日志配置文件的位置,如`/WEB-INF/log4j.properties`。日志配置文件控制RED5服务器的日志输出行为。 6. **webAppRootKey**:这个参数定义了应用程序的全局唯一名称,例如`/myapp`...

    RED5安装与配置

    `log4jConfigLocation`是用来设定日志配置文件的位置,例如"/WEB-INF/log4j.properties",这对于调试和监控RED5的运行状态至关重要。 `webAppRootKey`参数是应用的全局唯一名称,用于识别和区分不同的RED5应用程序...

    RED5安装与配置 RED5

    &lt;param-value&gt;/WEB-INF/log4j.properties ``` 6. **webAppRootKey**:指定程序的全局唯一标识名称。 ```xml &lt;param-name&gt;webAppRootKey &lt;param-value&gt;/myapp ``` #### 四、Handler配置文件的Bean配置...

    Spring+Hibernate笔记

    它定义了初始化参数,如web应用程序的根目录(webAppRootKey)和log4j配置文件的位置(log4jConfigLocation),以及监听器来初始化日志系统。 1.2. 配置Eclipse环境对于提高开发效率至关重要。这包括创建Java工程,...

    spring、struts、ibatis框架搭建流程

    - **context-param**:配置应用程序上下文参数,包括`webAppRootKey`和`log4jConfigLocation`,后者用于指定log4j配置文件的位置。 - **context-param**:配置Spring配置文件的位置,如`/WEB-INF/spring/...

Global site tag (gtag.js) - Google Analytics