2010-09-07 7 views
19

Actualmente tengo varios archivos de registro en mi aplicación usando log4net.Log4Net - Cerrar sesión en la pila de pila de excepción solo para ciertos archivos

Tengo un archivo de registro de nivel superior que contiene todo tipo de mensaje. También tengo un archivo de registro de error que contiene solo información de error. Estoy intentando configurarlo para que los detalles de excepción específicos y el seguimiento de la pila solo aparezcan en el archivo de registro de errores.

La llamada que estoy usando es Log.Error(myMessage, myException);

Mi config puede verse a continuación:

<configuration> 
    <log4net> 

    <root> 
    <level value="ALL"/> 
    <appender-ref ref="GeneralTextLog"/> 
    <appender-ref ref="ErrorTextLog"/> 
    </root> 

<!-- The general appender rolls by date --> 
<appender name="GeneralTextLog" type="log4net.Appender.RollingFileAppender"> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <level value="ALL"/> 
    </filter> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%d{HH:mm:ss.fff} [%type] %-5p %message%n"/> 
    </layout> 
    <rollingStyle value="Date"/> 
    <file value="C:/Logs/General_"/> 
    <datePattern value="yyyy_MM_dd'.log'" /> 
    <appendToFile value="true"/> 
    <staticLogFileName value="false"/> 
</appender> 

<!-- The Error appender rolls by date --> 
<appender name="ErrorTextLog" type="log4net.Appender.RollingFileAppender"> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <levelMin value="WARN"/> 
    <levelMax value="FATAL"/> 
    </filter> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%d{HH:mm:ss.fff} [%type] %-5p %message%newline%exception"/> 
    </layout> 
    <rollingStyle value="Date"/> 
    <file value="C:/Logs/Error_"/> 
    <datePattern value="yyyy_MM_dd'.log'" /> 
    <appendToFile value="true"/> 
    <staticLogFileName value="false"/> 
</appender> 

<!-- Loggers --> 
<logger name="DefaultLogger"> 
    <appender-ref ref="GeneralTextLog"/> 
    <level value="ALL"/> 
</logger> 

<logger name="ErrorLogger"> 
    <appender-ref ref="ErrorTextLog"/> 
    <levelMin value="WARN"/> 
    <levelMax value="FATAL"/> 
</logger> 

A pesar de que sólo he incluido% excepción en el conversionPattern para el registro de errores, stacktrace aparece en ambos registros. ¿Alguien sabe cómo puedo evitar que esto suceda?

Respuesta

37

configurar el diseño como este (GeneralTextLog Appender de):

<layout type="log4net.Layout.PatternLayout"> 
    <IgnoresException value="False" /> 
    ... 

Configuración IgnoresException en false cuenta la appender que la disposición se hará cargo de La excepción. Por lo tanto, puede optar por no imprimir el seguimiento de la pila.

+0

Esto ha funcionado. Gracias. – Rob

0

Desde su configuración, parece que su traza de pila se incluyó como parte de su parámetro message.

EDIT - Debería haber sido más claro. Supongo que cuando llamaste a los métodos de registro de log4net, tu primer parámetro (que es message) contenía el seguimiento de la pila, pero eso es solo una suposición. También es el único parámetro en sus dos apéndices. Si no tiene un parámetro en su formato de appender, no debería aparecer en ambos registros ... a menos que, por supuesto, su appender con la excepción sea el appender principal.

Tal vez puedas probar y ver lo que sucede:

<!-- Loggers --> 
<root> 
    <appender-ref ref="GeneralTextLog"/> 
    <level value="ALL"/> 
</root> 

<logger name="ErrorLogger"> 
    <appender-ref ref="ErrorTextLog"/> 
    <levelMin value="WARN"/> 
    <levelMax value="FATAL"/> 
</logger> 
+0

El seguimiento de la pila no está incluido en el primer 'mensaje' de parámetro. El mensaje es una cadena de texto simple de "Error", con la excepción pasada como el segundo parámetro. Cambiarlo a la configuración anterior lo hizo para que la entrada del registro solo apareciera en uno de los archivos (el generalTextLog), aún con el seguimiento de la pila. – Rob

+0

@Rob bien, gracias por avisarme. No he usado "ALL" antes en mis configuraciones, solo "DEBUG" o un rango específico. Lo único que puedo adivinar es que ALL podría ser responsable, pero no hay ninguna documentación para este valor de parámetro. Pruebe DEBUG en su lugar. Por cierto, ¿a qué método llamas para hacer este registro? Supongo que es logger.Debug() ya que no está apareciendo en ErrorLogger. – Dave

+0

@Rob lo siento, la comprensión de lectura me ha fallado. Veo que estás usando Error(). – Dave

Cuestiones relacionadas