2009-07-23 14 views
12

He configurado un logfileAppender y un consoleAppender en mi configuración de log4net para mi aplicación. Me gustaría que el apilador de archivos de registro solo escriba los mensajes ERROR y superiores y el appender de la consola para escribir DEPURACIÓN y más.El umbral de apéndice de Log4net no funciona

Mi configuración es:

<log4net debug="false"> 

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" > 
    <param name="File" value="log.txt" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
    <param name="ConversionPattern" value="%d %M - %m%n" /> 
    </layout> 
    <threshold value="ERROR"/> 
</appender> 

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > 
    <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%d %m%n" /> 
    </layout> 
</appender> 


<root> 
    <priority value="DEBUG" /> 
    <appender-ref ref="ConsoleAppender" /> 
    <appender-ref ref="LogFileAppender" /> 
</root> 

</log4net> 

estoy encontrando que tanto ERROR y de depuración se emitan a mi appender archivo de registro. ¿Cómo restringirlo solo a ERROR?

+0

¿Usted intentó el filtro sugerí en mi respuesta ? ¿No hizo ninguna diferencia? –

+0

He creado una aplicación de consola de muestra usando su configuración de log4net y estoy obteniendo el comportamiento exacto que parece que le falta ... vea mi respuesta a continuación. – Darragh

Respuesta

8

Tenga en cuenta también que la etiqueta level en el registrador no funciona de la misma manera que threshold o LevelMatchFilter.

Level indica qué declaraciones de registro realmente se generarán. Esto es lo que puedes probar en tu código.

Threshold por el contrario, filtra todos los mensajes de registro que caen por debajo de su umbral.

Esto significa que tener un umbral que es más alto que el nivel de registrador más alto no tiene sentido. He visto muchas veces cómo se establece un nivel de INFO (porque eso es lo que usarán la mayoría de los participantes), y luego se crea un appender que tiene un umbral de DEPURACIÓN. Y luego se sorprende cuando no aparece ningún mensaje DEBUG en el appender ...

6

Para obtener un filtrado muy específico para un appender, debe configurar un LevelMatchFilter o un LevelRangeFilter para que el apéndice del archivo de registro filtre los eventos que realmente se envían.
Por ejemplo:

<filter type="log4net.Filter.LevelRangeFilter"> 
    <levelMin value="ERROR"/> 
    <levelMax value="FATAL"/> 
</filter> 

o

<filter type="log4net.Filter.LevelMatchFilter"> 
    <levelToMatch value="ERROR"/> 
</filter> 

poner uno de éstos dentro de la etiqueta <appender>, y esto debería funcionar para usted:

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" > 
    <filter type="log4net.Filter.LevelMatchFilter"> 
     <levelToMatch value="ERROR"/> 
    </filter> 
    <param name="File" value="log.txt" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
     <param name="ConversionPattern" value="%d %M - %m%n" /> 
    </layout> 
    <threshold value="ERROR"/> 
</appender> 

Nota: Se ha actualizado para eliminar error señaló por kgiannakakis.

+0

@ Dav.evans, ¿puede confirmar que lo anterior es la configuración completa? ¿Qué registradores estás usando? ¿Es definitivo que no se realizan cambios de configuración programáticamente en su código? –

+0

misma pregunta/respuesta: http://stackoverflow.com/questions/6007/log4net-configuring-log-level –

0

Tiene que usar la propiedad additivity. Vea here para un ejemplo. Necesita definir dos registradores.

+0

Pero el archivo de registro es un Appender, y la aditividad pertenece a los Loggers. –

+0

He corregido esto. De hecho, crea dos registradores, cada uno con un appender y utiliza la propiedad additivity. – kgiannakakis

+0

seguramente no. ¿Cuál es el propósito del elemento umbral entonces? –

2

Las respuestas que recibe son parcialmente correctas. El Threshold solo se usa para establecer un límite inferior en el nivel adjunto. Un umbral de ERROR recibirá realmente ERROR y FATAL (que es ERROR "arriba").

Desea implementar un LevelMatchFilter con un valor de nivel de "ERROR" (y "DEPURAR" para el otro apilador). Sin embargo, también debe agregar un DenyAllFilter al final de su cadena de filtros.
Por ejemplo:

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" > 
    <param name="File" value="log.txt" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
    <param name="ConversionPattern" value="%d %M - %m%n" /> 
    </layout> 
    <filter type="log4net.Filter.LevelMatchFilter"> 
    <levelToMatch value="ERROR" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
</appender> 

he tenido que poner en práctica el DenyAllFilter desde log4net 1.2.10 (se puede ver la pregunta que tenía sobre este tema here).

+0

Maestrean Esto no funciona para mí con la versión más reciente de log4net. – BradLaney

+0

Lo usé y funcionó en la Versión 1.2.13.0. –

4

He creado una aplicación de consola de muestra con su configuración de log4net y estoy obteniendo el comportamiento exacto que parece que le falta ....

using System; 
using System.IO; 
using log4net; 
using log4net.Config; 

namespace SO_1171258 
{ 
    class Program 
    { 
     private static readonly ILog log = LogManager.GetLogger(typeof(Program)); 

     static void Main() 
     { 
      XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString())); 
      log.Error(new Exception("error log statment")); 
      log.Debug("debug log statment"); 
     } 
    } 
} 

Cuando ejecuto esta aplicación, la única cosa en el archivo de registro es:

2014-01-27 15: 02: 51,387 Principal - System.Exception: error del registro DECLARACIÓN

Y a la pantalla veo:

2014-01-27 15: 05: 52.190 System.Exception: error del registro DECLARACIÓN

27/01/2014 15: 05: 52.218 del registro de depuración DECLARACIÓN

Aquí está la totalidad de mi archivo app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> 
    </configSections> 
    <log4net debug="false"> 

    <appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" > 
     <param name="File" value="log.txt" /> 
     <param name="AppendToFile" value="true" /> 
     <layout type="log4net.Layout.PatternLayout,log4net"> 
     <param name="ConversionPattern" value="%d %M - %m%n" /> 
     </layout> 
     <threshold value="ERROR"/> 
    </appender> 

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%d %m%n" /> 
     </layout> 
    </appender> 


    <root> 
     <priority value="DEBUG" /> 
     <appender-ref ref="ConsoleAppender" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 

    </log4net> 
</configuration> 
Cuestiones relacionadas