【问题标题】:Changing application context path leads to using different (unknown) logging configuration更改应用程序上下文路径会导致使用不同的(未知)日志记录配置
【发布时间】:2013-05-28 07:37:55
【问题描述】:

设置:

  • Tomcat 6.0.16
  • Struts 2.1.6
  • Apache Commons 日志记录 1.0.4
  • Lo​​g4J 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,并根据简单的根记录器获取分配的记录器。之后根记录器被平台替换,但公共记录器没有更新为新配置。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    log4j.rootLogger=ERROR,Console  
    

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

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

    【讨论】:

    • “与日志记录无关”我知道。然而,这是我唯一改变的。但是我一半的记录器现在仍在写入同一个日志文件,但不再受我以前工作的 log4j.properties 的影响。
    • 更新日志记录的依赖项,您可能会影响它,最好将所有内容升级到当前版本。
    • 对不起,我没有得到第一部分,但更新到当前版本是不行的,因为我不知道是什么导致了这个问题。
    • 阅读更多关于公共日志的内容后,这可能是类加载器问题吗?
    • 你没有得到什么,你是使用 maven 还是一些显示依赖关系的工具?
    【解决方案2】:

    日志记录会在多个 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 相同)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 2015-07-20
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多