2015-08-21 14 views
5

我有一個自定義log4net的Appender的,看起來像這樣:log4net的遞歸讀鎖定收購不允許在此模式下

public class MyAppender : AppenderSkeleton 
{ 
    protected override void Append(LoggingEvent loggingEvent) 
    { 
     try 
     { 
      if (loggingEvent.Level == Level.Error || loggingEvent.Level == Level.Fatal) 
      { 
       DoWork(RenderLoggingEvent(loggingEvent)); 
      } 
     } 
     catch 
     { 
      // silently fail 
     } 
    } 
} 

時不時地,我會看到這個異常輸出:

log4net:ERROR Exception while logging 
System.Threading.LockRecursionException: Recursive read lock acquisitions not allowed in this mode. 
    at System.Threading.ReaderWriterLockSlim.TryEnterReadLockCore(TimeoutTracker timeout) 
    at System.Threading.ReaderWriterLockSlim.TryEnterReadLock(TimeoutTracker timeout) 
    at System.Threading.ReaderWriterLockSlim.EnterReadLock() 
    at log4net.Util.ReaderWriterLock.AcquireReaderLock() 
    at log4net.Repository.Hierarchy.Logger.CallAppenders(LoggingEvent loggingEvent) 
    at log4net.Repository.Hierarchy.Logger.ForcedLog(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception) 
    at log4net.Repository.Hierarchy.Logger.Log(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception) 

appender似乎工作正常,我的應用程序不顯示任何錯誤,但這些消息太討厭了。我喜歡乾淨的運行軟件,這是不乾淨的=(

是我的appender實施好嗎?有一些配置,我可以包括,以避免這個錯誤?我可以從gooogs找到最接近的答案是從這個錯誤報告log4net bug。我不打電話GetAppenders,所以它不適用於我的使用情況。任何幫助將被appriciated。

+1

'DoWork'做了什麼? – Rob

+0

@Rob,將錯誤發佈到服務總線 – Drew

+0

它是否曾經失敗? (我得到的是'DoWork'本身可能會記錄一些東西) – Rob

回答

3

在我的情況下,這發生在我的Appender正在調用正在記錄的代碼。因此,有發生遞歸日誌記錄。這是可視化如下:

-> Appender -> MyClassThatLogs -> Appender -> MyClassThatLogs -> etc... 

請參閱此SO貼子: logging/error handling inside a custom log4net appender