2011-05-25 59 views
2

我的日志记录配置与log4j存在问题。所有的日志消息都按照预期显示在root.log文件中,但stdout只显示root.log的子集,尽管我将它配置为相同。Log4j:日志文件正确,但Stdout只显示子集

编辑:准确地说,我错过了a.b的所有消息。

编辑2:我不是绝对确定,但我认为,从a.b.的一些消息。 (INFO和DEBUG)在标准输出上被记录,而另一些则没有。可能是与线程相关的问题?例如。一些线程在做日志记录,有些不是?

以下是我的log4j.xml,是否最终出现错误?

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > 

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> 
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} [%t] (%C:%L) %-5p - %m%n" /> 
     </layout> 
    </appender> 

    <appender name="FILE_ALL" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="${catalina.home}/logs/root.log"/> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%t] %-4r (%F:%L) %-5p %x - %m%n" /> 
     </layout> 
    </appender> 

    <logger name="a.b.master"> 
     <level value="DEBUG" /> 
     <appender-ref ref="CONSOLE" /> 
     <appender-ref ref="FILE_ALL" /> 
    </logger> 

    <logger name="a.b.master.orm.support.HibernateSessionFilter"> 
     <level value="INFO" /> 
     <appender-ref ref="CONSOLE" /> 
     <appender-ref ref="FILE_ALL" /> 
    </logger> 

    <logger name="a.b.master.aop.hibernate.OpenSessionInRequestInterceptor"> 
     <level value="info" /> 
     <appender-ref ref="CONSOLE" /> 
     <appender-ref ref="FILE_ALL" /> 
    </logger> 

    <root> 
     <level value="INFO"/> 
     <appender-ref ref="CONSOLE"/> 
     <appender-ref ref="FILE_ALL"/> 
    </root> 
</log4j:configuration> 

我正在使用Commons Logging作为实现。

感谢您的帮助!

+1

在你a.b.master.aop.hibernate.OpenSessionInRequestInterceptor,你有<电平值=“信息” />而不是信息 - 这可能是一个问题?否则:控制台输出中缺少哪些消息? – 2011-05-25 10:52:13

+0

好的,我会将信息更改为INFO,但我认为它不会造成巨大的差异。但感谢您的答案。我已经编辑了一些关于丢失消息 – Erik 2011-05-25 13:27:09

+0

的更多信息,只有logger.debug消息将流向控制台。您使用的是来自记录器的命令? – Jai 2011-05-25 14:06:53

回答

1

即使没有问题,我也找到了解决方案。我向我的ConsoleAppender添加了一个参数,所有内容都打印到stderr。这现在起作用。我猜它是eclipse或log4j的问题,因为如果我从终端(控制台)启动应用程序,我可以正确地看到所有日志消息。

<appender name="console" class="org.apache.log4j.ConsoleAppender"> 
     <param name="Target" value="System.err" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%t] %-4r (%F:%L) %-5p %x - %m%n" /> 
     </layout> 
    </appender> 
1

您的配置与我的日志非常类似,我的日志被转储到控制台和某个远程主机。试试这个,看看它是否适合你: -

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> 
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
     ... 
    </appender> 

    <appender name="FILE_ALL" class="org.apache.log4j.RollingFileAppender"> 
     ... 
    </appender> 

    <logger name="a.b.master"> 
     <level value="debug" /> 
    </logger> 

    <logger name="a.b.master.orm.support.HibernateSessionFilter"> 
     <level value="info" /> 
    </logger> 

    <logger name="a.b.master.aop.hibernate.OpenSessionInRequestInterceptor"> 
     <level value="info" /> 
    </logger> 

    <root> 
     <priority value="info"/> 
     <appender-ref ref="CONSOLE"/> 
     <appender-ref ref="FILE_ALL"/> 
    </root> 
</log4j:configuration> 

我不认为你需要在每一个A·B记录器来定义appender-ref因为它应该从根拿起附加器。另外,我使用priority而不是logger作为根目录。否则,你的配置看起来和我的相同,我可以正常工作。如果出于某种原因,这对您不起作用,我建议您从配置中删除自定义的a.b记录器,以查看是否能够在控制台中获取a.b消息。另外,只是供参考,我相信你已经知道这一点,但如果你的根设置为使用“信息”,那么真的不需要将自定义的a.b记录器设置为“信息”。我通常会让我的根“警告”,并让我的自定义记录器使用“调试”或“信息”覆盖它。

+0

感谢您的提示。我尝试过,但没有成功... – Erik 2011-05-25 17:36:40