log4j:ERROR尝试附加到名为[..]的已关闭的appender

时间:2011-11-23 13:39:42

标签: log4j

我在控制台上反复出现以下错误

log4j:ERROR Attempted to append to closed appender named [ConsoleAppender].
log4j:ERROR Attempted to append to closed appender named [FixedWindowRollingFile].

使用了log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
    <appender class="org.apache.log4j.rolling.RollingFileAppender" name="FixedWindowRollingFile">
        <param name="Append" value="true"/>
        <param name="ImmediateFlush" value="true"/>

        <rollingPolicy class="org.apache.log4j.rolling.FixedWindowRollingPolicy">
            <param name="fileNamePattern" value="logs/StandardizeAccountService.%i.log"/>
            <param name="minIndex" value="1"/>
            <param name="maxIndex" value="10"/>
        </rollingPolicy>
        <triggeringPolicy class="org.apache.log4j.rolling.SizeBasedTriggeringPolicy">
            <param name="MaxFileSize" value="1002400"/>
        </triggeringPolicy>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %p %c{1}:%L - %m%n"/>
        </layout>
    </appender>

    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.SimpleLayout"/>
    </appender>

    <logger name="com.arosys" additivity="false" >
        <level value="INFO" />
        <appender-ref ref="ConsoleAppender" />
        <appender-ref ref="FixedWindowRollingFile"/>
    </logger>

    <root>
        <priority value="INFO"/>
        <appender-ref ref="ConsoleAppender"/>
        <appender-ref ref="FixedWindowRollingFile"/>
    </root>
</log4j:configuration>

请帮我解决问题。

7 个答案:

答案 0 :(得分:24)

我得到了同样的错误:

log4j:ERROR Attempted to append to closed appender named [rollingFileAppender].

在我的log4j.xml

我有两个同名的记录器,如下面的

<logger name="java.sql.PreparedStatement" additivity="false">
    <level value="INFO"/>
    <appender-ref ref="rollingFileAppender"/>
</logger>

 <logger name="java.sql.PreparedStatement">
    <level value="INFO"/>
    <appender-ref ref="rollingFileAppender"/>
</logger>

我删除了副本,它有效。

答案 1 :(得分:23)

我在这里回答了类似的问题:https://stackoverflow.com/a/9973283/340290

就我而言,我有两个可用于Log4J的log4j.properties:一个通过将它放在类路径中而另一个通过编程方式加载(使用PropertyConfigurator.configure(..))。

在这两个文件中,我ConsoleAppender注册了同名stdout并用于同一类别两次(每个属性文件一个)。删除配置或属性文件解决了我的问题。

答案 2 :(得分:7)

可以使用

覆盖配置
BasicConfigurator.resetConfiguration();
PropertyConfigurator.configure(props);

答案 3 :(得分:0)

我不是说这是你描述的行为的原因(但可能),但是这一部分:

<logger name="com.arosys" additivity="false" >
   <level value="INFO" />
   <appender-ref ref="ConsoleAppender" />
   <appender-ref ref="FixedWindowRollingFile"/>
</logger>

毫无意义。通常,您设置了一个非加性记录器,将其重定向到其他地方而不是默认位置(您的根记录器),但您仍然将输出发送到默认位置。你也可以删除这个片段。

答案 4 :(得分:0)

为了澄清,因为我被MaDa回答误导,additivity = false将输出重定向到默认(根记录器)以外的其他位置,而不是默认值。 请参阅http://logging.apache.org/log4j/1.2/manual.html章节“Appenders and Layouts”

答案 5 :(得分:0)

这也可能意味着您已经运行了服务器,并且您正在尝试再次运行它。第二个实例无法写入日志文件,因为它已在您的服务器中打开。

解决方案:检查您的服务器是否已在运行,并在必要时重新启动它。

答案 6 :(得分:0)

就我而言,我错误地添加了2个“根”元素。