java - 在 Spring 中正确使用 Log4jConfigurer

标签 java spring log4j

在我们的应用程序中,我们决定将 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 容器本身的有值(value)的日志记录。

[ 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 配置名称,我就能看到日志。我想如果我们将配置作为静态 block 放在其中一个类中,这可能会消失——但在 Web 应用程序中,这似乎很奇怪。 我可以使用任何其他技巧吗?请随意指出我在这里遵循的任何/所有不正确的范例。

提前致谢!

最佳答案

在 Tomcat 中你可以在 tomcats context.xml 中配置这样的字符串

<Parameter name="log4j.configuration" value="whereEver"/>

另一种方式是通过 JNDI 配置。

BTW 阅读这个问题 Initializing Log4J with Spring? ,它包含一个链接(在已接受答案的评论中)到一个通过 servlet 监听器中的 jndi 配置 log4j 的实现。

关于java - 在 Spring 中正确使用 Log4jConfigurer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12275025/

相关文章:

java - 当在 run 方法中调用 sleep 时,Runnable 类中的方法会阻塞吗?

java - 如何根据输入值动态注入(inject)或获取bean?

hadoop - 如何启用hdfs和映射的审核日志?

java - Log4j 在测试类中不起作用

java - 在 log4j Appender 中记录时的循环依赖

java - 整数解析 int 不起作用

java - 如何将 jar 与 Maven Assembly Plugin 放在同一文件夹中

java - 如何在java中将 map 转换为二维数组?

spring - 使用复合 View 处理 BindingResults 和模型

java - 使用 spring 将属性直接 Autowiring 到 bean 中?