hiérarchie log4net et niveaux de journalisation

127

Ce site dit

Les enregistreurs peuvent se voir attribuer des niveaux. Les niveaux sont des instances de la classe log4net.Core.Level. Les niveaux suivants sont définis par ordre de priorité croissante :

  • TOUT
  • DÉBOGUER
  • INFO
  • PRÉVENIR
  • ERREUR
  • FATAL
  • DE

DEBUG semble avoir la priorité la plus basse et ERROR est plus élevé.

Question

  • Si je définis les exemples Min et Max DEBUG et ERROR, il imprime tout DEBUG, INFO, WARN et ERROR. Sans utilisation de filtre min et max. Si je spécifie ERROR (Logging level = ERROR) Inclura-t-il DEBUG, INFO & WARN
 <filter type="log4net.Filter.LevelRangeFilter">
     <param name="LevelMin" value="ERROR"/>
     <param name="LevelMax" value="ERROR"/>
 </filter>

Au lieu d'un filtre minimum et maximum. Est-il possible de configurer un niveau et d'inclure tous les autres niveaux inférieurs pour la journalisation.

Exemple - Réglez le niveau comme Erreur, il inclura DEBUG, INFO, WARN et ERROR. Est-ce possible avec log4net?

Publication de la configuration de log4net basée sur l'un des commentaires:

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

Siva
la source
avez-vous essayé de définir le niveau de journalisation sur INFO et vérifié s'il inclut INFO et DEBUG?
Par défaut le
5
DEBUG semble avoir la priorité la plus basse et l'erreur est la plus élevée. Ce n'est pas une priorité , mais un seuil supérieur ou supérieur à un message sera enregistré.
R. Schreurs
Avez-vous essayé d'utiliser uniquement levelMax? Je pense que cela devrait inclure tout ce qui se trouve en dessous si vous ne spécifiez pas unlevelMin
AN

Réponses:

90

Cela peut aider à comprendre ce qui est enregistré à quel niveau les enregistreurs peuvent se voir attribuer des niveaux. Les niveaux sont des instances de la classe log4net.Core.Level. Les niveaux suivants sont définis par ordre de gravité croissante - Niveau de journal.

Nombre de niveaux enregistrés pour chaque niveau de réglage:

 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
Mel Pama
la source
2
Désolé, je pensais que c'était wswg, pourquoi n'est-ce pas ??
Mel Pama
1
Vous pouvez consulter cette partie du site pour une mise en forme correcte des réponses
Jarod Moser
36

Pour la plupart des applications, vous souhaitez définir un niveau minimum mais pas un niveau maximum.

Par exemple, lors du débogage de votre code, définissez le niveau minimum sur DEBUG, et en production, définissez-le sur WARN.

Ilya Kogan
la source
S'il vous plaît vérifier ma question mise à jour, ma question est pour les niveaux et les déclarations de journal
Siva
Changez <level value="ALL" /> en <level value="WARN" />et vous n'obtiendrez que les avertissements et les erreurs.
Ilya Kogan
2
Non, cela n'aide pas. J'ai essayé de changer. Je n'ai pas vu les journaux pour la priorité ci-dessous inclus
Siva
12
Bien sûr, vous ne verrez pas les journaux sous la priorité. C'est une priorité minimale que vous définissez.
Ilya Kogan
19

DEBUG affichera tous les messages, INFO tous en plus des messages DEBUG, et ainsi de suite.
Habituellement, on utilise INFO ou WARN. Cela dépend de la politique de l'entreprise.

weismat
la source
S'il vous plaît vérifier ma question mise à jour, ma question est pour les niveaux et les déclarations de journal
Siva
Veuillez publier votre configuration log4Net entière, vous pourriez avoir deux enregistreurs qui interfèrent.
weismat
Et je n'ai personnellement utilisé que le réglage de niveau jusqu'à présent. Je pense que les réglages Min / Max devraient être évités si possible.
weismat
J'ai posté la configuration entière de log4net. Vérifiez s'il vous plaît. J'essaye d'apprendre et de mettre en œuvre.
Siva
16

Voici un code indiquant la priorité de tous les niveaux 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);
}

Mohamed-ali MAAMAR
la source
10

Comme d'autres l'ont noté, il est généralement préférable de spécifier un niveau de journalisation minimum pour enregistrer ce niveau et tout autre niveau plus sévère que lui. Il semble que vous ne pensiez qu'aux niveaux de journalisation à l'envers.

Cependant, si vous souhaitez un contrôle plus fin sur la journalisation des niveaux individuels, vous pouvez demander à log4net de n'enregistrer qu'un ou plusieurs niveaux spécifiques à l'aide de la syntaxe suivante:

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

Ou pour exclure un niveau de journalisation spécifique en ajoutant un nœud «refuser» au filtre.

Vous pouvez empiler plusieurs filtres ensemble pour spécifier plusieurs niveaux. Par exemple, si vous ne vouliez que les niveaux WARN et FATAL. Si les niveaux souhaités étaient consécutifs, le LevelRangeFilter est plus approprié.

Doc de référence: log4net.Filter.LevelMatchFilter

Si les autres réponses ne vous ont pas donné suffisamment d'informations, j'espère que cela vous aidera à obtenir ce que vous voulez de log4net.

ulty4life
la source
ah le refus est ce que je cherchais personnellement. aimerait des messages d'erreur info + mais pas de débogage. Merci pour cela.
Sarfaraaz
by adding a "deny" node to the filterComment?
mrhotroad
@mrhotroad Je ne sais pas à quel point la version actuelle de log4net est différente de la version de 2014, mais voici la documentation sur LevelMatchFilter.AcceptOnMatch. logging.apache.org/log4net/release/sdk/html/... Donc vous pouvez faire <levelToMatch value = "WARN" AcceptOnMatch = "false" />
ulty4life
8

C'est vrai, la documentation officielle ( Apache log4net ™ Manual - Introduction ) indique qu'il existe les niveaux suivants ...

  • TOUT
  • DÉBOGUER
  • INFO
  • PRÉVENIR
  • ERREUR
  • FATAL
  • DE

... mais curieusement quand je regarde l'assembly log4net.dll, v1.2.15.0 classe scellée log4net.Core.Level Je vois les niveaux suivants définis ...

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;

J'utilise TRACE en conjonction avec PostSharp OnBoundaryEntry et OnBoundaryExit depuis longtemps. Je me demande pourquoi ces autres niveaux ne figurent pas dans la documentation. De plus, quelle est la véritable priorité de tous ces niveaux?

barrypicker
la source
2
Pour ce que cela vaut, ils sont tous répertoriés sur le lien suivant, mais ils n'ont pas mis à jour leurs manuels depuis un moment, semble-t-il. logging.apache.org/log4net/release/sdk/html/…
Dinerdo
2
Level Fine; Niveau plus fin; Niveau Finest; Je vais juste utiliser ces trois à partir de maintenant.
maembe
-3

Essayez comme ça, ça a marché pour moi

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

Cela enregistre 3 types d'erreurs - erreur, information et avertissement

Dhananjay
la source
7
Selon la documentation de log4net pour Root Logger: "niveau: élément facultatif, maximum d'un autorisé . Définit le niveau de journalisation pour cet enregistreur. Cet enregistreur n'acceptera que les événements qui sont à ce niveau ou au-dessus. "
gonadarien
Pourquoi cette réponse a donné le vote?. Cela fonctionne aussi pour moi. D'où le vote.
amilamad
1
Parce que <level value = "WARN" /> aurait suffi.
rlesias