2012-02-28 58 views
0

在Web應用程序中,我使用log4j。
我使用了一個shutdown鉤終止日誌管理器:關閉tomcat時,Log4j中的這個異常是什麼?

Runtime.getRuntime().addShutdownHook(new Thread(){ 
      @Override 
      public void run(){ 
       LogManager.shutdown();    
      } 
     }); 

當Tomcat關閉我看到catalina.out中
以下異常是什麼意思?有什麼問題,我該如何解決它?

INFO: Illegal access: this web application instance has been stopped 
already. Could not load org.apache.log4j.helpers.NullEnumeration. 
The eventual following stack trace is caused by an error thrown for 
debugging purposes as well as to attempt to terminate the thread which 
caused the illegal access, and has no functional impact. Throwable 
occurred: java.lang.IllegalStateException 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1587) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546) 
     at org.apache.log4j.Category.getAllAppenders(Category.java:413) 
     at org.apache.log4j.Category.closeNestedAppenders(Category.java:226) 
     at org.apache.log4j.Hierarchy.shutdown(Hierarchy.java:467) 
     at org.apache.log4j.LogManager.shutdown(LogManager.java:267) 
     at com.MyLog4jStarter$1.run(Log4JStarterListener.java:133) Exception in thread "Thread-11" java.lang.NoClassDefFoundError: 
org.apache.log4j.helpers.NullEnumeration 
     at org.apache.log4j.Category.getAllAppenders(Category.java:413) 
     at org.apache.log4j.Category.closeNestedAppenders(Category.java:226) 
     at org.apache.log4j.Hierarchy.shutdown(Hierarchy.java:467) 
     at org.apache.log4j.LogManager.shutdown(LogManager.java:267) 
     at de.siemens.icn.hipath.dls.listeners.Log4JInitListener$1.run(Log4JInitListener.java:42) 
Caused by: java.lang.ClassNotFoundException: 
org.apache.log4j.helpers.NullEnumeration 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1701) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546) 

回答

1

這個例外的原因是某些類(例如NullEnumeration)已經被卸載。

向webapp添加掛鉤的正確方法是實現javax.servlet.ServletContextListener並將此代碼添加到contextDestroyed方法。您還必須在web.xml中註冊您的聽衆。

+0

啊!!!我在' ServletContextListener',但在'contextInitialized'不在'contextDestroyed'中 – Jim 2012-02-28 12:57:37

+0

因此關閉掛鉤轉到'contextDestroyed'? – Jim 2012-02-28 13:12:23

+0

通常是的,除非你有一些特殊的需求。 – mindas 2012-02-28 13:17:49

1

here

這是可能的,這是由Tomcat的失敗導致重裝Web應用程序。該應用程序已卸載,但所有線程都無法正常關閉。因此,當線程嘗試運行時,它們會因爲Tomcat關閉其類加載器而被破壞,並記錄一個錯誤。最好的解決方法是關閉應用程序的自動webapp重新加載:在Tomcat的server.xml中,找到聲明,並確保它被設置爲:reloadable =「false」

相關問題