jerarquía log4net y niveles de registro


127

Este sitio dice

Los registradores pueden tener niveles asignados. Los niveles son instancias de la clase log4net.Core.Level. Los siguientes niveles se definen en orden de prioridad creciente :

  • TODAS
  • DEPURAR
  • INFORMACIÓN
  • ADVERTIR
  • ERROR
  • FATAL
  • APAGADO

DEPURACIÓN parece tener menor prioridad y ERROR es mayor.

Pregunta

  • Si configuro el ejemplo Min y Max DEBUG y ERROR, imprime todo DEBUG, INFO, WARN y ERROR. Sin uso de filtro min y max. Si especifico ERROR (Nivel de registro = ERROR) ¿Incluirá DEBUG, INFO & WARN
 <filter type="log4net.Filter.LevelRangeFilter">
     <param name="LevelMin" value="ERROR"/>
     <param name="LevelMax" value="ERROR"/>
 </filter>

En lugar de filtro mínimo y máximo. ¿Es posible configurar un nivel e incluir todos los demás niveles por debajo para el registro?

Ejemplo: establecer el nivel como Error, incluirá DEBUG, INFO, WARN y ERROR. ¿Es esto posible con log4net?

Publicar la configuración de log4net en función de uno de los comentarios:

     <?xml version="1.0" encoding="utf-8" ?>
     <configuration>
        <configSections>
            <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
        </configSections >
        <log4net debug="true">
  <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <layout type="log4net.Layout.XMLLayout" /> -->
        <param name="File" value="TestLog.log" />
        <param name="AppendToFile" value="false" />
        <layout type="log4net.Layout.PatternLayout">
            <header type="log4net.Util.PatternString" value="[START LOG] %newline" />
            <footer type="log4net.Util.PatternString" value="[END LOG] %newline" />
            <conversionPattern value="%d [%t] %-5p - %m%n" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="DEBUG"/>
            <param name="LevelMax" value="ERROR"/>
        </filter>
    </appender>
<root>
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
    </root>
    <logger name="log4NetExample">
        <!-- <appender-ref ref="B" /> -->
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
    </logger>
</log4net>


¿ha intentado establecer el nivel de registro en INFO y comprobó si incluye INFO y DEBUG?
Predeterminado el

55
DEPURACIÓN parece tener la prioridad más baja y Error es la más alta. Esto no es una prioridad , pero se registrará un umbral superior o superior a un mensaje.
R. Schreurs

¿Has probado solo usar levelMax? Creo que eso debería incluir todo, debajo de ella, si no se especifica unlevelMin
AN

Respuestas:


90

Esto podría ayudar a comprender qué se registra a qué nivel se pueden asignar niveles a los registradores. Los niveles son instancias de la clase log4net.Core.Level. Los siguientes niveles se definen en orden de gravedad creciente: Nivel de registro.

Número de niveles registrados para cada nivel de configuración:

 ALL    DEBUG   INFO    WARN    ERROR   FATAL   OFF
All                        
DEBUG  DEBUG                  
INFO   INFO   INFO               
WARN   WARN   WARN   WARN           
ERROR  ERROR  ERROR  ERROR  ERROR      
FATAL  FATAL  FATAL  FATAL  FATAL  FATAL  
OFF    OFF    OFF    OFF    OFF    OFF    OFF

2
Lo siento, pensé que esto era wswg, ¿por qué no?
Mel Pama

1
Puede echar un vistazo a esta parte del sitio para obtener el formato adecuado de las respuestas
Jarod Moser

36

Para la mayoría de las aplicaciones, le gustaría establecer un nivel mínimo pero no un nivel máximo.

Por ejemplo, cuando depure su código, configure el nivel mínimo en DEBUG, y en producción, configúrelo en WARN.


Por favor revise mi pregunta actualizada, Mi pregunta es para niveles y declaraciones de registro
Siva

Cambie <level value="ALL" /> a <level value="WARN" />y obtendrá solo las advertencias y errores.
Ilya Kogan

2
No, no ayuda. Traté de cambiar. No vi registros para la prioridad inferior incluida
Siva

12
Por supuesto, no verá los registros debajo de la prioridad. Esa es una prioridad mínima que está estableciendo.
Ilya Kogan

19

DEBUG mostrará todos los mensajes, INFORMACIÓN, además de los mensajes DEBUG, y así sucesivamente.
Por lo general, uno usa INFO o WARN. Esto depende de la política de la empresa.


Por favor revise mi pregunta actualizada, Mi pregunta es para niveles y declaraciones de registro
Siva

Publique toda su configuración de log4Net, es posible que tenga dos registradores que interfieren.
weismat

Y personalmente he usado solo la configuración de nivel hasta ahora. Creo que la configuración mínima / máxima debe evitarse si es posible.
weismat

He publicado toda la configuración de log4net. Por favor, compruebe. Estoy tratando de aprender e implementar.
Siva

16

Aquí hay un código que dice sobre la prioridad de todos los niveles de log4net:

TraceLevel(Level.All); //-2147483648

TraceLevel(Level.Verbose);   //  10 000
TraceLevel(Level.Finest);    //  10 000
    
TraceLevel(Level.Trace);     //  20 000
TraceLevel(Level.Finer);     //  20 000
    
TraceLevel(Level.Debug);     //  30 000
TraceLevel(Level.Fine);      //  30 000
    
TraceLevel(Level.Info);      //  40 000
TraceLevel(Level.Notice);    //  50 000
    
TraceLevel(Level.Warn);      //  60 000
TraceLevel(Level.Error);     //  70 000
TraceLevel(Level.Severe);    //  80 000
TraceLevel(Level.Critical);  //  90 000
TraceLevel(Level.Alert);     // 100 000
TraceLevel(Level.Fatal);     // 110 000
TraceLevel(Level.Emergency); // 120 000
    
TraceLevel(Level.Off); //2147483647


private static void TraceLevel(log4net.Core.Level level)
{
   Debug.WriteLine("{0} = {1}", level, level.Value);
}


10

Como otros han señalado, generalmente es preferible especificar un nivel de registro mínimo para registrar ese nivel y cualquier otro más severo que este. Parece que solo estás pensando en los niveles de registro al revés.

Sin embargo, si desea un control más detallado sobre el registro de niveles individuales, puede indicarle a log4net que registre solo uno o más niveles específicos utilizando la siguiente sintaxis:

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

O para excluir un nivel de registro específico agregando un nodo "denegar" al filtro.

Puede apilar varios filtros juntos para especificar múltiples niveles. Por ejemplo, si solo deseabas los niveles WARN y FATAL. Si los niveles que deseaba eran consecutivos, entonces LevelRangeFilter es más apropiado.

Doc de referencia: log4net.Filter.LevelMatchFilter

Si las otras respuestas no le han proporcionado suficiente información, espero que esto lo ayude a obtener lo que desea de log4net.


Ah, negar es lo que yo personalmente estaba buscando. quisiera información + mensajes de error pero no depurar. gracias por esto.
Sarfaraaz el

by adding a "deny" node to the filter¿cómo?
mrhotroad

@mrhotroad No estoy seguro de cuán diferente es la versión actual de log4net de la versión en 2014, pero aquí está el documento en LevelMatchFilter.AcceptOnMatch. logging.apache.org/log4net/release/sdk/html/… Para que pueda hacer <levelToMatch value = "WARN" AcceptOnMatch = "false" />
ulty4life

8

Es cierto que la documentación oficial ( Manual de Apache log4net ™ - Introducción ) establece que existen los siguientes niveles ...

  • TODAS
  • DEPURAR
  • INFORMACIÓN
  • ADVERTIR
  • ERROR
  • FATAL
  • APAGADO

... pero extrañamente cuando veo el ensamblado log4net.dll, v1.2.15.0 clase sellada log4net.Core.Level veo los siguientes niveles definidos ...

public static readonly Level Alert;
public static readonly Level All;
public static readonly Level Critical;
public static readonly Level Debug;
public static readonly Level Emergency;
public static readonly Level Error;
public static readonly Level Fatal;
public static readonly Level Fine;
public static readonly Level Finer;
public static readonly Level Finest;
public static readonly Level Info;
public static readonly Level Log4Net_Debug;
public static readonly Level Notice;
public static readonly Level Off;
public static readonly Level Severe;
public static readonly Level Trace;
public static readonly Level Verbose;
public static readonly Level Warn;

He estado usando TRACE junto con PostSharp OnBoundaryEntry y OnBoundaryExit durante mucho tiempo. Me pregunto por qué estos otros niveles no están en la documentación. Además, ¿cuál es la verdadera prioridad de todos estos niveles?


2
Por lo que vale, todos están enumerados en el siguiente enlace, pero no han actualizado sus manuales en un tiempo que parece. logging.apache.org/log4net/release/sdk/html/…
Dinerdo

2
Nivel bien; Level Finer; Nivel más fino; Solo voy a usar estos tres de ahora en adelante.
maembe

-3

Intenta así, funcionó para mí

<root>
  <!--<level value="ALL" />-->
  <level value="ERROR" />
  <level value="INFO" />
  <level value="WARN" />     
</root>

Esto registra 3 tipos de errores: error, información y advertencia


77
Según docs log4net para Root Logger: "nivel: Elemento opcional, máximo de un permitido . Define el nivel de registro para este registrador Este registrador sólo aceptará caso de que lo son. A este nivel o superior. "
gonadarian

¿Por qué esta respuesta ha dado voto? A mí también me está funcionando. De ahí arriba votando.
amilamad

1
Porque <level value = "WARN" /> habría sido suficiente.
rlesias
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.