【问题标题】:Working log4j config ignored by Spring classesSpring 类忽略了工作 log4j 配置
【发布时间】:2010-01-27 12:07:30
【问题描述】:

我使用 log4j,他工作得很好。一个 log4j.xml 文件在我的类路径中,我使用 appender 和类别...再次,它适用于我的代码或其他库的代码。

但春季课程继续向标准输出充斥着我想在其他地方登录的消息。开始讨厌了。

违规消息:org.springframework.jms:一些错误.... 更一般地说,org.springframework 包的所有类都将消息发送到标准输出。

所以我把它放在我的 log4j.xml 中:

<appender name="JMS-ERROR" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="tms.logs.folder/tms.logs.files.prefix-jms-error.log"/>
    <param name="Append" value="true"/>
    <param name="MaxFileSize" value="1000KB"/>
    <param name="MaxBackupIndex" value="2"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="**DVIDEA** %d{dd.MM.yyyy HH:mm:ss} %c  %m%n"/>
    </layout>
    <filter class="org.apache.log4j.varia.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG" />
        <param name="LevelMax" value="FATAL" />
    </filter>
</appender>


<category name="org.springframework.jms" additivity="false">
    <appender-ref ref="JMS-ERROR"/>
</category>

它与其他图书馆合作。为什么不是春天?

我做了一些研究,似乎 Spring 使用 common-logging,而不是 log4j。这是一个可能的原因吗?任何解决方法?

我尝试将 log4jConfigurationListener 添加到我的 web.xml。他正在工作,但我仍然无法控制 spring 错误消息。

<context-param>
   <param-name>log4jConfigLocation</param-name>
   <param-value>classpath:log4j.xml</param-value>
</context-param>
<context-param>
   <param-name>log4jRefreshInterval</param-name>
   <param-value>10000</param-value>
</context-param>
<listener>
   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

编辑:

更多信息:

  • 我使用的是 Tomcat 5.5
  • 由于历史原因,log4j.property(旧的 log4j 配置)仍然存在。我尝试删除它 => 没有变化。

编辑 2: 我使用以下解决方法,但我对此不满意:它不可配置

java.util.logging.Logger springLogger = Logger.getLogger("org.springframework.jms");
springLogger.setLevel(Level.OFF);

【问题讨论】:

  • 你用的是什么容器? WebSphere ???
  • tomcat,我编辑了问题

标签: java spring log4j tomcat5.5


【解决方案1】:

请注意,在 Spring 示例中,他们使用 slf4j 将日志消息从 Commons Logging 路由到 log4j。在 Maven 的 pom.xml 中看起来是这样的:

<!-- Exclude Commons Logging -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>org.springframework.context</artifactId>
    <version>${spring.version}</version>
    <exclusions>
        <!-- Exclude Commons Logging in favor of SLF4j -->
        <exclusion>
            <groupId>org.apache.commons</groupId>
            <artifactId>com.springsource.org.apache.commons.logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- Add slf4j API -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.api</artifactId>
    <version>${slf4j.version}</version>
</dependency>

<!-- Add Commons Logging -> slf4j bridge -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.org.apache.commons.logging</artifactId>
    <version>${slf4j.version}</version>
    <scope>runtime</scope>
</dependency>

<!-- Add slf4j -> log4j bridge -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.log4j</artifactId>
    <version>${slf4j.version}</version>
    <scope>runtime</scope>
</dependency>

【讨论】:

  • 确实,slf4j 似乎是要走的路。但是为一些(烦人的)不受控制的错误消息更改日志框架对我来说似乎有点过头了。或者也许从 log4j 到 slf4j 的切换是无痛的? (我相信理论上是的,但我怀疑)
  • 你不应该改变你的日志框架,因为 slf4j 只是一个门面。我发布的配置适用于 log4j 登录您的代码。
  • 这只是部分正确;您必须从可能出现的所有其他地方排除公共日志记录(并且可能有很多)。除非您有特定原因,否则我也不建议使用 com.springsource 工件。在我的回答中查看更多详细信息。
【解决方案2】:

您可能需要:

<bean id="log4jInitialization"
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetClass"
            value="org.springframework.util.Log4jConfigurer" />
        <property name="targetMethod" value="initLogging" />
        <property name="arguments">
            <list>
                <value>conf/log4j.xml</value>
            </list>
        </property>
    </bean>

【讨论】:

  • bes 已经很好地初始化了,但是我仍然在标准输出中收到了来自 org.springframework.* 的消息。
【解决方案3】:

Spring 使用 Apache Commons Logging,它反过来决定是使用 STDOUT(通过java.util.logging)还是 Log4j。如果您在 STDOUT 上获得 Spring 输出,那么 commons-logging 由于某种原因没有找到 log4j。

如果您设置系统属性org.apache.commons.logging.diagnostics.dest,commons-logging 可以配置为记录其诊断,告诉您它正在采取哪些步骤来确定 log4j 是否存在。

所以在你的tomcat启动脚本中,设置系统属性,例如

-Dorg.apache.commons.logging.diagnostics.dest=STDOUT

【讨论】:

    【解决方案4】:

    您必须使用 SLF4J,并包含到您想要的日志记录平台 (log4j) 的桥梁,但您必须从所有其他可能被拉入的地方排除 commons-logging。这有助于有一个 IDE 来执行此操作,或者您可以为 commons-logging 放置一个虚拟条目。有关详细信息,请参阅SLF4J FAQ entry

    之前提到的使用 com.springsource 工件的答案,但是如果您使用 Maven Central,那么正确的方法是:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.10</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.10</version>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 2013-09-12
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 2014-07-20
      相关资源
      最近更新 更多