2015-08-21 16 views
5

Ho un appender log4net personalizzato che assomiglia a questo:Log4net ricorsivo leggere acquisizioni di blocco non sono ammessi in questa modalità

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 
     } 
    } 
} 

Di tanto in tanto, ci vediamo questa eccezione nell'output:

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) 

L'appender sembra funzionare correttamente e la mia app non mostra errori, ma questi messaggi sono davvero fastidiosi. Mi piace il software in esecuzione pulito e questo non è pulito = (

La mia implementazione di appender è ok? C'è qualche configurazione che posso includere per evitare questo errore? La risposta più vicina che riesco a trovare dai gooog è da questa segnalazione di bug log4net bug. Non sto chiamando GetAppenders in modo che non si applichi al mio caso d'uso.Qualsiasi aiuto sarebbe appropriato.

+1

Cosa fa 'DoWork'? – Rob

+0

@Rob, pubblica l'errore su un bus di servizio – Drew

+0

Ha mai esito negativo? (Quello che mi viene in mente è che 'DoWork' potrebbe registrare qualcosa) – Rob

risposta

3

Nel mio caso, questo si è verificato quando il mio Appender stava chiamando il codice che stava registrando. Quindi, si verificava la registrazione ricorsiva Questo è visualizzato sotto:

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

Vedere anche questo messaggio SO : logging/error handling inside a custom log4net appender