设置:
我做了什么:
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”不再列出了,但是如果我调试代码,我可以验证它们是否存在。
问题
编辑:我越来越近了
我正在使用的平台在启动时加载最少的日志记录。在更改上下文之前,之后立即加载了高级日志记录,一切都很好。由于某种原因,web.xml的监听器(Spring初始化等)现在在加载高级日志记录之前运行。这些类使用apache commons logging api并根据简单的根记录器获取分配的记录器。之后,根记录器将被平台替换,但公共记录器不会使用新配置进行更新。
新问题: 正如我在下面所述,更改平台中的任何内容都是不可取的。 那么为什么在我改变上下文时听众会提前运行,我该如何防止这种情况。“
答案 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相同)