2015-10-21 16 views
5

Abbiamo un sistema di registrazione sviluppato internamente, e volevamo ottenere i vantaggi di log4net come poter utilizzare più appendici contemporaneamente. Abbiamo deciso di spostare il sistema di registrazione precedente in un appender log4net personalizzato. Funzionava alla grande quando il sistema legacy era configurato correttamente, ma il logger legacy scrive effettivamente su un client WCF (rallentandolo per la registrazione dettagliata, il motivo per cui volevamo coinvolgere altri appendici di log4net) e recentemente la configurazione di WCF non era proprio quella avrebbe dovuto essere. Quando ciò accadeva, l'applicazione sembrava funzionare bene, ma ovviamente l'appender personalizzato per il sistema legacy non funzionava. Le altre appendici hanno funzionato bene, ma non vi è stato alcun output dall'appender legacy personalizzato e nessun messaggio di errore che indica che si è verificato un problema.registrazione/gestione errori all'interno di un appatore log4net personalizzato

Qual è il modo corretto di gestire la registrazione "ricorsiva", ovvero la registrazione da un appender log4net personalizzato? Ho provato una soluzione banale: afferrare log4net dal suo oggetto statico e registrazione all'interno della appender:

public class MyCustomAppender : AppenderSkeleton 
{ 

    protected override void Append(log4net.Core.LoggingEvent loggingEvent) 
    { 
     try 
     { 
      // something which throws here... 
     } 
     catch (Exception ex) 
     { 
      log4net.LogManager.GetLogger(this.GetType()).Error(this.GetType().ToString() + ": error during append", ex); 
     } 
    } 
} 

Questo è stato un misero fallimento, "System.Threading.LockRecursionException: ricorsive acquisizioni blocco di lettura non consentito in questa modalità." Giusto; era la soluzione ingenua.

Ho anche provato:

this.ErrorHandler.Error(this.GetType().ToString() + ": error during append", ex); 

nel gestore di eccezioni, come sembrava possibile potrebbe essere la cosa giusta. Non è successo niente di ovvio

C'è un modo per registrare gli errori tramite log4net all'interno di un appender? O devo fare qualcosa come scrivere hard-code direttamente nel registro eventi di Windows? Ovviamente c'è un grande pericolo di discesa ricorsiva infinita, ma penserei che ci sarebbe un modo per far sapere all'operatore che una delle appendici non è riuscita a correre.

JR

risposta

3

Naturalmente, non appena ho postato la domanda, mi sono ricordato qualcosa. log4net ha un interruttore di debug all'interno di appSettings. Ho usato questo codice:

this.ErrorHandler.Error(this.GetType().ToString() + ": error during append", ex); 

all'interno del blocco catch, quindi eseguire l'impostazione sulla magia:

<appSettings> 
    <!--this is wonderful magic--> 
    <add key="log4net.Internal.Debug" value="true" /> 
</appSettings> 

Ora il ConsoleAppender (l'altro appender stavo usando) messo fuori il messaggio di eccezione appender personalizzato.

JR

0

Assicuratevi di avere questa linea in alto: usando System.Threading;

+0

Ho dimenticato quale fosse il problema originale, ma il mio punto era di ottenere un appender log4net personalizzato per accedere al meccanismo log4net in fase di runtime. Per quanto ne so, una istruzione "using" risolverà le cose solo in fase di compilazione. Non ho avuto un problema di compilazione. Avevo bisogno di vedere cosa stava andando storto in fase di runtime. – jrv