0

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

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

违规消息: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 中。他正在工作,但我仍然无法控制弹簧错误消息。

<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);
4

4 回答 4

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>
于 2010-01-27T15:07:18.043 回答
0

您必须使用 SLF4J,并包含连接到您想要的日志记录平台 (log4j) 的桥接器,但您必须从可能被拉入的所有其他地方排除 commons-logging。有一个 IDE 来执行此操作会有所帮助,或者您可以为公共日志记录放置一个虚拟条目。有关详细信息,请参阅SLF4J 常见问题解答条目

使用 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>
于 2015-03-13T16:52:45.333 回答
0

您可能需要:

<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>
于 2010-01-27T12:58:11.713 回答
0

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
于 2010-01-27T13:25:37.173 回答