2012-02-16 13 views
6

Sembra che ci siano molte informazioni e documentazione su come registrare informazioni extra quando è presente un'eccezione, ma ho difficoltà a cercare di capire come creare un target che è essenzialmente un honeypot per le eccezioni. Piuttosto che passare in rassegna vari file di log cercando di vedere se sono state registrate eccezioni, vorrei solo una copia di tutte le eccezioni per andare a una specifica destinazione che scrive su un file exceptions.log.Come configurare una destinazione NLog per registrare solo eccezioni?

Come posso fare?

risposta

17

Non posso dire di aver effettivamente provato questo, ma potresti essere in grado di utilizzare uno when filter e uno condition per ottenere ciò che desideri.

Ecco un esempio dalla pagina condition:

<rules> 
    <logger name="*" writeTo="file"> 
     <filters> 
      <when condition="length(message) > 100" action="Ignore" /> 
      <when condition="equals('${logger}','MyApps.SomeClass')" action="Ignore" /> 
      <when condition="(level >= LogLevel.Debug and contains(message,'PleaseDontLogThis')) or level==LogLevel.Warn" action="Ignore" /> 
      <when condition="not starts-with('${message}','PleaseLogThis')" action="Ignore" /> 
     </filters> 
    </logger> 
</rules> 

per raggiungere il tuo obiettivo, si potrebbe fare un filter come questo:

<rules> 
    <logger name="*" writeTo="file"> 
     <filters> 
      <when condition="length('${exception}') > 0" action="Log" /> 
     </filters> 
    </logger> 
</rules> 

L'idea è che solo si desidera registrare il messaggio se la lunghezza della stringa di eccezioni è> 0. Alcuni degli esempi when condition hanno utilizzato la sintassi di NLog LayoutRenderer (ad esempio ${message}) e altri no (ad esempio message). Non sono sicuro di quale sia corretto o quale sintassi utilizzare in quale situazione. L'esempio che ho postato direttamente sopra potrebbe far sì che i messaggi vengano registrati SOLO se è presente un'eccezione. Dovresti anche essere in grado di configurare in modo tale che i tuoi messaggi su un target vengano registrati "normalmente" e i messaggi al tuo "ExceptionHoneypotTarget" vengano registrati solo se è presente un'eccezione.

Forse qualcosa di simile:

<rules> 
    <logger name="*" writeTo="ExceptionHoneypot"> 
     <filters> 
      <when condition="length('${exception}') > 0" action="Log" /> 
     </filters> 
    </logger> 
    <logger name="*" writeTo="file"> 
    </logger> 
</rules> 

Come ho detto all'inizio, non ho effettivamente provato nulla di tutto questo, ma sembra che si dovrebbe essere in grado di farlo, si spera simile a quello mostrato sopra .

In alternativa, è possibile utilizzare uno FilteringWrapper attorno al proprio HoneypotTarget. La configurazione potrebbe essere simile a questo:

<?xml version="1.0" ?> 
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"  
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <targets> 
      <target name="Honeypot" xsi:type="FilteringWrapper" 
       condition="length('${exception}')>0"> 
      <target xsi:type="File" fileName="${basedir}/Honeypot.txt" /> 
      </target>  
      <target name="normal" xsi:type="File" fileName="${basedir}/Log.txt" /> 
      </target> 
     </targets>  
     <rules> 
      <logger name="*" minlevel="Debug" writeTo="Honeypot,normal" /> 
     </rules> 
    </nlog> 

ho basato l'esempio FilteringWrapper su un esempio da da here. Il modo in cui dovrebbe funzionare, se la mia configurazione è corretta, è che tutti i messaggi verranno registrati su "Log.txt" e i messaggi con un'eccezione non nulla verranno registrati su "Honeypot.txt".

+0

Ah grande risposta, grazie. –

+0

Ho provato questa soluzione, ma ho dovuto racchiudere $ {exception} tra virgolette come questa: length ('$ {exception}'). Ho presentato una nuova revisione per la revisione tra pari. –

4

Si prega di notare che se si vuole solo eccezioni il filtro dovrebbe essere:

<when condition="length('${exception}') = 0" action="Ignore" /> 
Problemi correlati