2013-06-28 106 views
1

我有這個下面的log4j.xml文件中,我使用的是自定義的Log4J的AppenderLog4j自定義Appender最初拋出ClassNotFoundException?

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
    <appender class="org.apache.log4j.RollingFileAppender" name="FILE"> 
     <param value="${logfile}" name="File" /> 
     <param value="10" name="MaxBackupIndex" /> 
     <param value="200MB" name="MaxFileSize" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
     <param value="%d[%t] %-5p(%F:&lt;%M&gt;:%L)- %m%n" name="ConversionPattern" /> 
     </layout> 
    </appender> 

    <appender class="com.ubsc.at.properties.CustomAppender" name="CUSTAPPEN"> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param value="%m" name="ConversionPattern" /> 
     </layout> 
     </appender> 

    <appender class="org.apache.log4j.AsyncAppender" name="ASYNC"> 
    <param name="Blocking" value="false"/> 
    <param name="BufferSize" value="1000"/> 
     <appender-ref ref="CUSTAPPEN" /> 
    </appender> 

    <root> 
     <level value="${logLevel}" /> 
     <appender-ref ref="FILE" /> 
     <appender-ref ref="ASYNC" /> 
    </root> 
</log4j:configuration> 

當應用程序開始我得到這個以下異常在我的碼頭控制檯

java.lang.ClassNotFoundException: com.ubsc.at.properties.CustomAppender 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:169) 
     at org.apache.log4j.helpers.Loader.loadClass(Loader.java:198) 
     at org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:247) 
     at org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:176) 
     at org.apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:191) 
     at org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:284) 
     at org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:176) 
     at org.apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:191) 
     at org.apache.log4j.xml.DOMConfigurator.parseChildrenOfLoggerElement(DOMConfigurator.java:523) 
     at org.apache.log4j.xml.DOMConfigurator.parseRoot(DOMConfigurator.java:492) 
     at org.apache.log4j.xml.DOMConfigurator.parse(DOMConfigurator.java:1001) 
     at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:867) 
     at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:773) 
     at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:483) 
     at org.apache.log4j.LogManager.<clinit>(LogManager.java:127) 
     at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73) 
     at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242) 
     at org.eclipse.jetty.util.log.Slf4jLog.<init>(Slf4jLog.java:44) 
     at org.eclipse.jetty.util.log.Slf4jLog.<init>(Slf4jLog.java:27) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at java.lang.Class.newInstance0(Class.java:355) 

我見問題是在我的類加載之前,log4j被初始化了。

可以做些什麼來避免這個錯誤?複製現有log4j.jar中的類文件並創建一個新的jar?

請分享你的想法。有沒有什麼辦法可以將我的CustomAppender設置爲只爲我的應用程序包加載?

+0

包含您的自定義appender在Jetty lib文件夾中的jar嗎? –

+0

不包含。 – Kiran

+0

除非你有很好的理由不把它放在'lib'文件夾中,否則我會這樣做。我懷疑你的log4j配置是通過Jetty父類加載器讀取的。 –

回答

1

如上所述,您正在運行類加載器問題。

如果您正在從父類加載器或從WebApp URLClassLoader加載slf4J + Log4J,那麼很難從您的堆棧跟蹤中猜測出更多的信息(需要更多信息)。

無論如何,如果SLF4J和log4j的安裝在碼頭/lib文件夾(例如最可能由碼頭父類加載器加載)的任何自定義附加器應該是在一個罐子中相同/lib文件夾。

另外,這裏是你可以嘗試(未經測試):

  1. 開始與「標準​​」的log4j配置文件(沒有自定義的appender)
  2. 讓你自定義的appender類在一個罐子裏坐在你的webapp的或WEB-INF/lib夾在WEB-INF/classes
  3. 覆蓋你的servlet的ìnit方法直接獲得的類加載程序的日誌記錄4J您的自定義的appender。喜歡的東西

    Logger.getLogger("my.package").addAppender(new MyCustomAppender(blah));

任何你的servlet登錄反對 「my.package」 內,現在應該引導到您的自定義的appender。

注意:SLF4J通常不能很好地應對類裝載機的擺弄。