Log4j没有将System.out写入文件

时间:2012-01-25 17:07:49

标签: windows tomcat console log4j

我在Windows 2008上使用tomcat6设置了log4j。这些语句被记录到日志文件中,但没有记录System.out个调用。

当我从命令提示符运行tomcat6.exe时,提示符上会显示System.out个调用,但日志文件中不会记录这些调用。

我已定义ConsoleAppenderFilelogger,如下所示:

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

  <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true" threshold="debug">
      <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.SimpleLayout">
    </layout>
      </appender>

      <appender name="CATALINA" class="org.apache.log4j.appender.TimeAndSizeRollingAppender">
      <param name="File" value="${catalina.home}/logs/catalina.log"/>
              <param name="Threshold" value="DEBUG"/>
      <param name="Append" value="true"/>
      <param name="ImmediateFlush" value="true"/>   
      <param name="DatePattern" value=".yyyy-MM-dd"/>
      <param name="MaxFileSize" value="100MB"/> 
      <param name="MaxRollFileCount" value="100"/>
      <param name="ScavengeInterval" value="30000"/>
      <param name="BufferedIO" value="false"/>
      <param name="CompressionAlgorithm" value="ZIP"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{MMM dd, yyyy HH:mm:ss a} %c%n \r%p: %m%n"/>
    </layout>
    </appender>

<logger name="org.apache" additivity="false">
    <level value="INFO"/>
    <appender-ref ref="CATALINA" />
</logger>

    <root>
            <priority value="INFO"/>
    <appender-ref ref="CONSOLE"/>
    </root>

2 个答案:

答案 0 :(得分:1)

在上面的log4j配置中,您创建的ConsoleAppender会将所有邮件记录到标准输出中。与System.out.println()调用的位置相同。现在,当您创建第二个Appender(FileAppender)时,您不再写入标准输出,而是现在写入文件。

我建议更改system.out.println()调用以使用Log4j调用[error(),info(),debug()等。]

public class MyClass{
 private static Logger logger = Logger.getLogger(MyClass.class);

 public MyClass(){
    logger.debug("Hello World");
 }
}

通过执行此操作,您不会将log4j与标准输出调用混合和匹配,然后可以在控制台和文件写入之间根据需要配置应用程序。通过System.out调用使用Logger的一个好处是,它们可以在运行时配置,并且可以在不同级别记录消息。

根据评论进行修改

默认情况下,Tomcat将stdout消息记录到%tomcat_home%/logs/catalina.out(每个tomcat规范名称可能略有不同)Tomcat使用名为JULI的日志记录框架来执行其基本日志记录操作。如果您只是希望将日志写入其他位置,然后是tomcat文件夹,则可以通过编辑该文件来完成 %TOMCAT_HOME / CONF / logging.properties

您可能想要解决的另一个问题是完全重定向标准输出。这是不赞成的,但可以做到。如果查看文件catalina.bat(或unix中的.sh),您将看到LOGGING_MANAGER的启动选项,它将覆盖默认的JULI实现。我从未使用过此选项,因此您需要更深入地研究它。要了解JULI,请阅读Apache的Wiki article

答案 1 :(得分:1)

This page提示如何做到这一点,但它有点神秘。简而言之:

  • 打开tomcat配置的context.xml文件。对我来说,在Eclipse内部开发,这是在
  • 下的Eclipse Workspace中
  

\工作区\项目\服务器\服务器名称设置\ config.xml中

还有一个全局的tomcat版本,值得一试

  

\ Tomcat的\ CONF \ context.xml中

  • 将swallowOutput =“true”添加到上下文中,如下所示

    <context swallowOutput="true">
    
  • (我认为可选)设置应用程序日志记录。我在我的应用程序中使用了LogBack,但我不确定它是否相关,因为这是通过内部Tomcat日志记录而不是您的应用程序日志记录

  • 在我的tomcat.logging属性中,我有以下日志配置行。这些行定义了我的System.out语句所使用的日志文件,尽管其他人已经说过它转到了catalina.out文件

    2localhost.org.apache.juli.FileHandler.level = FINE
    2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
    2localhost.org.apache.juli.FileHandler.prefix = localhost.
    
  • 现在当你做一个System.out.println时,它应该出现在你的localhost.log文件中,就像它对我来说一样,不过正如我所说,有些人说它进入了catalina.log

    < / LI>