This is in log4j-1.2.8.

Running in a web application, the following code is executed in this: 
order

Logger log = getLogger("some log");   // not controlled by me, and so the 
default configuration is loaded

// later by me
myProperties = getDynamicProperties();
PropertyConfigurator.configure(myProperties);  //hoping to set the 
configuration I'm interested in


Later in the application I get an error saying that:  log4j:ERROR Attempted to append 
to closed appender

Mucking through the code, adding LogLog messages with exceptions, I can 
now see that even though AppenderAttachableImpl does indeed attempt to 
call "remove" to remove the appender from the list of appenders for the 
Logger, it apparently doesn't get removed.

Here's the "evidence" from my SystemErr logs:


[9/20/04 13:34:46:938] SystemErr     R log4j:WARN Closing appender: 
Console_Appender from stack trace.....
[9/20/04 13:34:46:938] SystemErr     R java.lang.Exception: closed 
appender...
[9/20/04 13:34:46:938] SystemErr     R  at 
org.apache.log4j.WriterAppender.close(WriterAppender.java:194)
[9/20/04 13:34:46:938] SystemErr     R  at 
org.apache.log4j.helpers.AppenderAttachableImpl.removeAllAppenders(AppenderAttachableImpl.java:133)
[9/20/04 13:34:46:938] SystemErr     R  at 
org.apache.log4j.Category.removeAllAppenders(Category.java:881)
[9/20/04 13:34:46:938 ]SystemErr     R  at 
org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:594)

   [  SNIP  ]

[9/20/04 13:34:51:250] SystemErr     R log4j:ERROR Attempted to append to 
closed appender named [Console_Appender], to logger: 
org.kp.msgvolumechk.listener.MsgRestrictionListener with message: Checking 
MessageRestrictor switch false


Here's the code in AppenderAttachableImpl:

 /**
   * Remove and close all previously attached appenders.
   * */
  public
  void removeAllAppenders() {
    if(appenderList != null) {
      int len = appenderList.size();
      for(int i = 0; i < len; i++) {
        Appender a = (Appender) appenderList.elementAt(i);
        LogLog.warn("closing appender: " + a.getName()); // added for 
debugging by tom
        a.close();
      }
      appenderList.removeAllElements();  // doesn't seem to work?!?
      appenderList = null;
    }
  }


Is this a known problem, or can anyone tell if I'm doing something silly?
Note I really want to be able to call PropertyConfigurator.configure() 
with a Properties object, since I want to dynamically modify the 
properties before the configuration takes place. So, suggesting that I 
correctly set the log4j.configuration System property is not my first 
choice--but it might be the solution I have to go with.

Also, it seems that calling resetConfiguration() causes the first Logger 
that was created to not work, so that doesn't seem to be a solution for me 
either.


--
Tom Goetze

Reply via email to