You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by bu...@apache.org on 2003/09/17 21:05:35 UTC

DO NOT REPLY [Bug 23224] New: - cannot use NTEventLogAppender in multiple classloaders (webapps)

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=23224>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=23224

cannot use NTEventLogAppender in multiple classloaders (webapps)

           Summary: cannot use NTEventLogAppender in multiple classloaders
                    (webapps)
           Product: Log4j
           Version: 1.2
          Platform: Other
        OS/Version: Other
            Status: NEW
          Severity: Normal
          Priority: Other
         Component: Appender
        AssignedTo: log4j-dev@jakarta.apache.org
        ReportedBy: jmm@sublogic.com


single Tomcat running, multiple webapps, each of which has their own log4j and 
wants to use NTEventLogAppender.

The problem is that the class loads its native library without try/catch'ing, 
so when any classloader besides the first attempts to load the library (as part 
of its classloader loading the NTEventLogAppender class file itself), there's 
an exception and the logging fails.

so, the end of NTEventLogAppender.java is now:

  static {
    System.loadLibrary("NTEventLogAppender");
  }

That would be better with a try/catch of the loadLibrary so then the other 
webapps could load the class and use it.  Note that the system classloader is 
where the library is actually loaded, so the other classloaders should have 
access to it just fine.

  static {
    try {
      System.loadLibrary("NTEventLogAppender");
    } catch (Throwable t) {}
  }

(would prob. wanna replace Throwable with whatever the specific type of 
exception is that's thrown for the second-and-later classloaders, I don't have 
my logs around to check any more).

Alternative work-around is to use something System-wide (outside of the 
individual classloaders) like a System property:

  static {
    if(System.getProperty("NTEventLogAppender.loaded") == null) {
      System.loadLibrary("NTEventLogAppender");
      System.setProperty("NTEventLogAppender.loaded", "true");
    }
  }

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: log4j-dev-help@jakarta.apache.org