在我们的应用程序中,我们决定将 log4j 配置文件命名为自定义名称,以避免无意中从另一个 jar 加载默认文件。要配置它,我们使用org.springframework.util.Log4jConfigurer
指定 log4j 位置。
<bean
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass">
<value>org.springframework.util.Log4jConfigurer</value>
</property>
<property name="targetMethod">
<value>initLogging</value>
</property>
<property name="arguments">
<list>
<value>classpath:com/kilo/custom-log4j.xml</value>
</list>
</property>
</bean>
这也有助于将所有配置保留在代码中,让新开发人员开始运行(而不是将其保留在某些setenv.sh
容器中并单独用于测试用例)。到目前为止,我们非常高兴,直到我们发现 Spring 容器本身的一些有价值的日志记录因此被遗漏了。
[ 2012-09-05 00:16:43,188 [main] support.DefaultListableBeanFactory.registerBeanDefinition():618 INFO ]: Overriding bean definition for bean 'beanA': replacing [Generic bean: class [com.kilo.spring.context.log.ClassA]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [com/kilo/spring/context/log/spring-application-context-2.xml]] with [Generic bean: class [com.kilo.spring.context.log.ClassA]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [com/kilo/spring/context/log/spring-application-context-1.xml]]
[ 2012-09-05 00:16:43,235 [main] support.DefaultListableBeanFactory.preInstantiateSingletons():555 INFO ]: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@8453227: defining beans [org.springframework.beans.factory.config.MethodInvokingFactoryBean#0,beanB,beanA]; root of factory hierarchy
如果我通过系统属性配置名称,log4j.configuration
我可以看到日志。我想如果我们将配置作为静态块放在其中一个类中,这可能会消失 - 但在 Web 应用程序中,这样做似乎很奇怪。我可以使用任何其他技巧吗?随意指出我在这里遵循的任何/所有不正确的范例。
提前致谢!