1

设置:

  • 雄猫 6.0.16
  • Struts 2.1.6
  • Apache Commons 日志记录 1.0.4
  • 日志4J 1.2.17

我做了什么:

变化server.xml

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

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

问题:

应用程序中的所有内容都运行良好(乍一看)。所有链接都正确且有效等。

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

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

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

但是“公共日志记录器”不再列出,尽管如果我调试代码,我可以验证它们是否存在。

问题:

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

编辑:我越来越近了:

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

新问题:正如我在下面所说,更改平台中的任何内容都不是选项。那么为什么当我更改上下文时侦听器会更早运行,我该如何防止这种情况发生。

4

2 回答 2

1

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

根记录器是您在 log4j 配置中使用的。例如

log4j.rootLogger=ERROR,Console  

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

我没有看到任何关于日志记录的问题,而不是在最近的版本中关于实施优先级的问题。

于 2013-05-28T09:28:14.723 回答
0

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

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

web.xml

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

初始化监听器.java

package com.[...];

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

{代码}

(顺便说一句。监听器顺序应该与 web.xml 相同)

于 2013-05-29T11:04:38.853 回答