在tomcat上下文重新加载后,Log4j停止写入控制台

时间:2013-12-04 23:41:34

标签: java eclipse tomcat logging log4j

我在tomcat下遇到log4j问题。

当Eclipse将新版本的应用程序部署到tomcat时,它会重新加载应用程序上下文。重新加载上下文完成后,Web应用程序级别记录器停止写入控制台。

只有tomcat记录器仍然有效。

我在web appplication的log4j.xml中的配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
    </layout>
</appender>
<root>
    <level value="INFO" />
    <appender-ref ref="stdout"/>
</root>
</log4j:configuration>

我已将log4j-1.2.16.jar放到我的应用程序的/ WEB-INF / lib目录中。除了我已经将另一个log4j-1.2.16.jar副本放到tomcat的/ lib目录中,根据官方tomcat网站上提供的教程。

2 个答案:

答案 0 :(得分:0)

使用org.apache.log4j.ConsoleAppenderfollow选项。此选项确定appender是否尊重配置后System.outSystem.err的重新分配。默认情况下,false

<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out" />
    <param name="Follow" value="true" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" 
               value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
    </layout>
</appender>

答案 1 :(得分:0)

感谢Paul的回答,我发现了logger在重新加载上下文后没有记录的真正原因。问题是在应用程序初始化时我调用了以下代码:

System.setErr( new PrintStream( new LoggingOutputStream( Logger.getLogger("outLog"), Level.ERROR ), true));
System.setOut( new PrintStream( new LoggingOutputStream( Logger.getLogger("outLog"), Level.INFO ), true));

此代码应该将写入控制台的所有输出(如System.out.println)写入生产服务器上的xml日志,但在开发过程中,我正在使用控制台,因此必须将其关闭。

当我添加&lt; param name =“Follow”value =“true”/&gt;在我的配置中,在任何情况下根本没有输出,所以由于这个选项,我设法发现了真正的问题。

相关问题