My Spring ApplicationContext文件正在加载两次。这是使用标准的maven webapp结构,带有一个web.xml。只有一个上下文文件,并且只定义了一个servlet。没有context-loader-listener。
我尝试了以下方法来解决问题
Web.XML
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="testApp" version="2.5">
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/beans.test.xml</param-value>
</init-param>
</servlet>
</web-app>
豆文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:annotation-driven />
<bean id="testController" class="Test" />
</beans>
Java类
public class Test {
private static Logger logger = Logger.getLogger(Test.class);
public Test() {
logger.debug("IN INIT");
}
}
所有这些导致以下行
2014-08-12 15:56:32,427 - INFO : [beans.factory.xml.XmlBeanDefinitionReader-loadBeanDefinitions] - Loading XML bean definitions from ServletContext resource [/WEB-INF/beans.test.xml]
2014-08-12 15:56:32,427 - INFO : [beans.factory.xml.XmlBeanDefinitionReader-loadBeanDefinitions] - Loading XML bean definitions from ServletContext resource [/WEB-INF/beans.test.xml]
2014-08-12 15:56:33,015 - DEBUG: [Test-<init>] - IN INIT
2014-08-12 15:56:33,015 - DEBUG: [Test-<init>] - IN INIT
到目前为止......似乎没有任何效果。
编辑:
该应用程序使用Log4j(版本1.2.17)和/ src / main / resources下的log4j.xml文件,具有以下结构
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d - %-5p: [%c{4}-%M] - %m%n" />
</layout>
</appender>
<logger name="org.springframework.beans.factory">
<level value="INFO" />
<appender-ref ref="console" />
</logger>
<logger name="Test">
<level value="DEBUG" />
<appender-ref ref="console" />
</logger>
<root>
<level value="ERROR" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
答案 0 :(得分:1)
在我看来,Logger
错误地(或者说,意外地)配置了<logger name="Test" additivity="false">
<level value="DEBUG" />
<appender-ref ref="console" />
</logger>
。您似乎有一个根记录器和一个额外的弹簧/自定义记录器,您没有将additivity标志设置为false(默认情况下为true)。在这种情况下,当您发送日志事件时,子记录器将记录该消息,然后将查找其父项并将其记录。
将子项的可加性设置为false以禁用任何记录该事件的父项。
Appender Additivity
- 记录器C的日志语句的输出将转到C及其祖先中的所有appender。这就是这个词的意思 “appender additivity”。
- 但是,如果记录器C的祖先,比如P,将additivity标志设置为false,则C的输出将被定向到所有 C中的追随者及其祖先,包括P而不是P 在P。
的任何祖先中的追随者- 记录器默认情况下将其可加性标志设置为true。
更改
{{1}}
类似于Spring记录器。