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".
Ah grande risposta, grazie. –
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. –