更改应用程序上下文路径会导致使用不同(未知)日志记录配置

时间:2013-05-28 07:37:56

标签: spring tomcat struts2 log4j apache-commons-logging

设置:

  • Tomcat 6.0.16
  • Struts 2.1.6
  • Apache Commons Logging 1.0.4
  • Log4J 1.2.17

我做了什么:

server.xml中的更改:

<Context path="/" .../></Context>

<Context path="/shop" .../></Context>

问题

应用程序中的所有内容都工作正常(乍一看)。所有链接都正确且有效等。

现在我发现使用Commons Logging(使用Log4J)的Loggers(通常是Spring,Struts和OGNL中的Logger)使用的记录器配置与之前使用的默认配置不同。直接在应用程序中使用Log4J的记录器可以正常使用此配置。

出于调试目的,我有一个JSP列出所有记录器:

Logger.getRootLogger().getLoggerRepository( ).getCurrentLoggers()

但是“commons logging logger”不再列出了,但是如果我调试代码,我可以验证它们是否存在。

问题

  • 如何找到其他配置/根记录器?
  • 我是否必须更改与上下文路径更改相关的struts配置(或其他位置)中的任何内容?
  • 任何想法可能是什么问题?

编辑:我越来越近了

我正在使用的平台在启动时加载最少的日志记录。在更改上下文之前,之后立即加载了高级日志记录,一切都很好。由于某种原因,web.xml的监听器(Spring初始化等)现在在加载高级日志记录之前运行。这些类使用apache commons logging api并根据简单的根记录器获取分配的记录器。之后,根记录器将被平台替换,但公共记录器不会使用新配置进行更新。

新问题: 正如我在下面所述,更改平台中的任何内容都是不可取的。 那么为什么在我改变上下文时听众会提前运行,我该如何防止这种情况。“

2 个答案:

答案 0 :(得分:0)

目前,Apache Tomcat使用JDK日志记录。如果未将commons-logging.properties文件放入源目录,则使用commons日志记录的默认记录器将为log4j。无论如何,Tomcat不会使用该日志记录,因为它需要一个特殊的配置来告诉它使用log4j。

root logger是你在log4j配置中使用的。例如

log4j.rootLogger=ERROR,Console  

更改上下文路径与应用程序使用的日志记录无关。

我没有看到任何与日志记录有关的问题,而是在最近发布的有关实现优先级的问题中

答案 1 :(得分:0)

日志记录在多个tomcat Web应用程序之间创建依赖关系,因此需要加载此模块的特定顺序。将上下文重命名为“/ shop”会导致另一个顺序,因为StandardContext.filterDefs是一个简单的HashMap,并不保留server.xml的顺序。

我可以解决在侦听器中运行所需步骤的问题。

的web.xml

<listener>
     <listener-class>com.[...].InitListener</listener-class>
</listener>

InitListener.java

package com.[...];

public class InitListener
{
    static
    {
        // init Log4J, etc.
    }
}

{代码}

(顺便说一句,监听器命令应该与web.xml相同)