【问题标题】:Duplicate log4j Logging重复 log4j 日志记录
【发布时间】:2014-02-25 12:23:12
【问题描述】:

我的类路径中有以下 log4j.xml 文件:

<appender class="org.apache.log4j.ConsoleAppender" name="Console">
    <param name="Threshold" value="info" />
    <layout class="org.apache.log4j.PatternLayout">
        <param value="%d %-5p [%t] %C (%F:%L) - %m%n" name="ConversionPattern"/>
    </layout>
    <filter class="org.apache.log4j.varia.LevelRangeFilter">
      <param value="info" name="LevelMax"/>
      <param value="info" name="LevelMin"/>
    </filter>
</appender>

<logger name="de.scm.cci.importer">
    <level value="info"/>
</logger>

<logger name="com.mchange">
    <level value="info"/>
</logger>
<logger name="jdbc">
    <level value="error"/>
</logger>
<logger name="org.hibernate">
    <level value="info"/>
</logger>
<logger name="org.springframework">
    <level value="info"/>
</logger>

<root>
    <level value="INFO"/>
    <appender-ref ref="Console"/>
</root>

这是输出的前几行:

log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@7220722.
log4j: Using URL [file:/opt/app/cci/CCIImporter/jar/log4j.xml] for automatic log4j configuration.
log4j: Preferred configurator class: org.apache.log4j.xml.DOMConfigurator
log4j: System property is :null
log4j: Standard DocumentBuilderFactory search succeded.
log4j: DocumentBuilderFactory is: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
log4j: debug attribute= "true".
log4j: reset attribute= "false".
log4j: Threshold ="null".
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [de.scm.cci.importer] additivity to [true].
log4j: Level value for de.scm.cci.importer is  [info].
log4j: de.scm.cci.importer level set to INFO
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [com.mchange] additivity to [true].
log4j: Level value for com.mchange is  [info].
log4j: com.mchange level set to INFO
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [jdbc] additivity to [true].
log4j: Level value for jdbc is  [error].
log4j: jdbc level set to ERROR
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [org.hibernate] additivity to [true].
log4j: Level value for org.hibernate is  [info].
log4j: org.hibernate level set to INFO
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [org.springframework] additivity to [true].
log4j: Level value for org.springframework is  [info].
log4j: org.springframework level set to INFO
log4j: Level value for root is  [INFO].
log4j: root level set to INFO
log4j: Class name: [org.apache.log4j.ConsoleAppender]
log4j: Setting property [threshold] to [INFO].
log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
log4j: Setting property [conversionPattern] to [%d %-5p [%t] %C (%F:%L) - %m%n].
log4j: Setting property [levelMax] to [INFO].
log4j: Setting property [levelMin] to [INFO].
log4j: Adding filter of type [class org.apache.log4j.varia.LevelRangeFilter] to appender named [Console].
log4j: Adding appender named [Console] to category [root].
2014-02-25 13:20:25,534 INFO  [main] de.scm.cci.importer.RunTest (RunTest.java:21) - Starting loop mode
2014-02-25 13:20:25,537 INFO  [main] de.scm.cci.importer.RunTest (RunTest.java:24) - Started...
PERSISTENCE LOADING
2014-02-25 13:20:25,767 INFO  [main] org.springframework.context.support.AbstractApplicationContext (AbstractApplicationContext.java:513) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@52545254: startup date [Tue Feb 25 13:20:25 CET 2014]; root of context hierarchy
233 [main] INFO org.springframework.context.support.ClassPathXmlApplicationContext  - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@52545254: startup date [Tue Feb 25 13:20:25 CET 2014]; root of context hierarchy
2014-02-25 13:20:25,877 INFO  [main] org.springframework.beans.factory.xml.XmlBeanDefinitionReader (XmlBeanDefinitionReader.java:316) - Loading XML bean definitions from class path resource [de/scm/cci/backend/public/spring-config.xml]

一旦spring开始加载,每一行的输出都会翻倍:

2014-02-25 13:20:25,767 INFO  [main] org.springframework.context.support.AbstractApplicationContext (AbstractApplicationContext.java:513) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@52545254: startup date [Tue Feb 25 13:20:25 CET 2014]; root of context hierarchy
233 [main] INFO org.springframework.context.support.ClassPathXmlApplicationContext  - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@52545254: startup date [Tue Feb 25 13:20:25 CET 2014]; root of context hierarchy

我完全不知道第二行是从哪里来的。

编辑: 很奇怪:尽管我将所有可能的阈值和内容设置为仅 INFO,但我收到了 WARN 消息...?

【问题讨论】:

    标签: java spring logging log4j


    【解决方案1】:

    因为你只声明了一个 appender,并且重复日志的格式相同,所以很明显你有多个日志框架同时运行:

    • log4j 在您自己的代码中
    • Spring 中的公共日志记录

    你需要做的是:

    • 从类路径中删除 commons-logging 依赖项。如果您使用的是 maven,则必须从 每个 Spring 模块 中排除 commons-logging jar。
    • 将 jcl-over-slf4j 添加到您的类路径

    Maven 示例(如何删除 commons-logging):注意:您需要在每个 Spring 依赖项中使用此排除语法

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
      <exclusions>
        <exclusion>
          <artifactId>commons-logging</artifactId>
          <groupId>commons-logging</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    

    Maven 示例(如何添加 slf4j,你可能已经在这样做了):

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.7</version>
    </dependency>
    
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>1.7.7</version>
    </dependency>
    

    如果您不使用 Maven,请告诉我,我会尽力帮助您处理特定环境。

    【讨论】:

    • 好吧,这似乎成功了!我目前还没有使用 maven,并从类路径中删除了 commons-logging jar。 jcl-over-sl4j 目前不存在,这可能会导致问题吗?我现在无法完全测试,可能在本周末。
    • 我不确定如果您使用基本 log4j 是否有问题,但如果您尝试在 slf4j 上使用 log4j,您将需要 jcl-over-slf4j 包。
    【解决方案2】:

    Spring Framework 不直接使用 log4j - 它使用 commons-logging。

    它的行为将取决于您的应用程序类路径中的其他日志记录实现。

    您的类路径中有哪些与日志记录相关的 jar?

    【讨论】:

    • 好的,我该如何从这里开始?我了解,我混合了不同的日志记录机制。我假设我还必须配置 commons-logging 并查看它的去向?
    猜你喜欢
    • 2011-06-17
    • 2013-11-08
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    相关资源
    最近更新 更多