2010-01-27 73 views
0

我使用log4j,他工作得很好。 log4j.xml文件在我的类路径中,我使用appender和category ...再次,它对我的​​代码或其他库的代码工作得很好。春季班忽略工作log4j配置

但春天班继续洪水标准输出消息我想登录其他地方。它开始讨厌。

违规消息:org.springframework.jms:有些错误....更多一般来说,org.springframework包的所有类都会向stdout发送消息。

所以我把这个在我的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> 

这是一个与其他LIBRAIRIE工作。为什么不弹簧?

我做了一些研究,并且发现Spring使用通用日志记录,而不是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); 
+0

您正在使用什么容器? WebSphere? – pgras 2010-01-27 12:37:00

+0

tomcat,我编辑了这个问题 – 2010-01-27 12:52:50

回答

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> 
+0

已经很好的初始化了,但是我仍然从org.springframework。*中得到了标准输出的消息。 – 2010-01-27 13:12:01

0

Spring使用Apache的百科全书日志记录依次决定是否使用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 
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> 
+0

事实上,slf4j似乎是要走的路。 但是更改一些(令人讨厌的)未受控制的错误消息的日志记录框架对我来说似乎过分了。 或者,也许从log4j切换到slf4j是痛苦的? (我敢肯定,是的,但我怀疑) – 2010-01-27 16:47:57

+0

你不应该改变你的日志框架,因为slf4j只是一个门面。我发布的配置工作正常,在您的代码中使用log4j日志记录。 – axtavt 2010-01-27 18:03:08

+0

这只是部分正确的;你必须排除可能出现的其他地方的公共日志记录(并且可能有很多)。除非您有特定的原因,否则我不会推荐使用com.springsource工件。在我的答案中查看更多详情。 – 2015-03-13 16:54:21

0

必须使用SLF4J,并包括桥你想要的(log4j的)记录平台,但你必须排除共享记录从它可能会在其他地方被拉进来。它有助于让IDE做到这一点,或者你可以在公用日志中输入一个虚拟条目。有关该详情,请参阅使用com.springsource文物提到SLF4J FAQ entry

前面的回答,但是如果你使用Maven中央正确的方式来做到这一点是:

<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>