2012-02-16 12 views
6

Parece que hay mucha información y documentación sobre cómo registrar información adicional cuando hay una excepción, pero tengo problemas para tratar de encontrar la forma de crear un objetivo que sea esencialmente un honeypot para las excepciones. En lugar de revisar varios archivos de registro para ver si se registraron excepciones, solo me gustaría una copia de todas las excepciones para ir a un destino específico que escribe en un archivo exceptions.log.¿Cómo configuro un objetivo NLog para solo registrar excepciones?

¿Cómo puedo hacer esto?

Respuesta

17

No puedo decir que lo haya intentado, pero es posible que pueda usar un when filter y un condition para lograr lo que desea.

Aquí se muestra un ejemplo de la página de 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> 

para lograr su objetivo, es posible hacer una filter así:

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

La idea es que sólo desea registrar el mensaje si la longitud de la cadena de excepción es> 0. Algunos de los ejemplos when condition utilizaron la sintaxis NLog LayoutRenderer (por ejemplo, ${message}) y algunos no (por ejemplo, message). No estoy seguro de cuál es la correcta o qué sintaxis usar en qué situación. El ejemplo que publiqué directamente arriba puede hacer que los mensajes se registren SOLAMENTE si hay una excepción presente. También debe poder configurar que sus mensajes a un destino se registren "normalmente" y que los mensajes a su "ExceptionHoneypotTarget" se registren solo si hay una excepción presente.

Tal vez algo como esto:

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

Como ya he mencionado al principio, que no han intentado realmente nada de esto, pero parece que usted debería ser capaz de hacerlo, con suerte similar a lo mostrado anteriormente .

Alternativamente, podría usar un FilteringWrapper alrededor de su HoneypotTarget. La configuración puede ser algo como esto:

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

basé el ejemplo FilteringWrapper en un ejemplo de desde here. La forma en que debería funcionar, si mi configuración es correcta, es que todos los mensajes se registrarán en "Log.txt" y los mensajes con una excepción no nula se registrarán en "Honeypot.txt".

+0

Ah gran respuesta, gracias. –

+0

Intenté esta solución, pero tuve que adjuntar $ {exception} en comillas simples como esta: length ('$ {exception}'). He enviado una nueva revisión para revisión por pares. –

4

Tenga en cuenta que si quieres sólo excepciones el filtro debe ser:

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