hierarchia log4net i poziomy logowania

127

Ta strona mówi

Rejestratorom można przypisać poziomy. Poziomy są instancjami klasy log4net.Core.Level. Następujące poziomy są definiowane w kolejności rosnącego priorytetu :

  • WSZYSTKO
  • ODPLUSKWIĆ
  • INFO
  • OSTRZEC
  • BŁĄD
  • FATALNY
  • POZA

DEBUG wydaje się mieć najniższy priorytet, a ERROR jest wyższy.

Pytanie

  • Jeśli ustawię przykład Min i Max DEBUG i ERROR, wypisze wszystko DEBUG, INFO, WARN i ERROR. Bez użycia filtra min i max. Jeśli określę ERROR (poziom logowania = ERROR) Czy będzie zawierać DEBUG, INFO i WARN
 <filter type="log4net.Filter.LevelRangeFilter">
     <param name="LevelMin" value="ERROR"/>
     <param name="LevelMax" value="ERROR"/>
 </filter>

Zamiast filtra min i max. Czy jest możliwe skonfigurowanie poziomu i uwzględnienie wszystkich innych niższych poziomów do logowania?

Przykład - Ustaw poziom jako Błąd, który będzie zawierał DEBUG, INFO, WARN i ERROR. Czy jest to możliwe z log4net?

Publikowanie konfiguracji log4net na podstawie jednego z komentarzy:

     <?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
źródło
czy próbowałeś ustawić poziom rejestrowania na INFO i sprawdziłeś, czy zawiera INFO i DEBUG?
Domyślnie
5
Wydaje się, że DEBUG ma najniższy priorytet, a błąd jest najwyższy. To nie jest priorytet , ale próg wyższy lub wyższy dla wiadomości zostanie zarejestrowany.
R. Schreurs,
Czy próbowałeś tylko używać levelMax? Myślę, że powinno to obejmować wszystko poniżej, jeśli nie określiszlevelMin
AN

Odpowiedzi:

90

Może to pomóc w zrozumieniu, co jest rejestrowane na jakim poziomie Rejestratorom można przypisać poziomy. Poziomy są instancjami klasy log4net.Core.Level. Następujące poziomy są zdefiniowane w kolejności rosnącej wagi - Log Level.

Liczba poziomów zarejestrowanych dla każdego poziomu ustawień:

 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
źródło
2
Przepraszam, myślałem, że to wswg, dlaczego tak nie jest?
Mel Pama
1
Możesz rzucić okiem na tę część witryny, aby uzyskać prawidłowe formatowanie odpowiedzi
Jarod Moser
36

W przypadku większości zastosowań chciałbyś ustawić poziom minimalny, ale nie maksymalny.

Na przykład podczas debugowania kodu ustaw minimalny poziom na DEBUG, a podczas produkcji ustaw go na WARN.

Ilya Kogan
źródło
Proszę sprawdzić moje zaktualizowane pytanie, Moje pytanie dotyczy poziomów i zapisów dziennika
Siva,
Zmień <level value="ALL" /> na, <level value="WARN" />a otrzymasz tylko ostrzeżenia i błędy.
Ilya Kogan
2
Nie, to nie pomaga. Próbowałem się zmienić. Nie widziałem logów dla poniższego priorytetu
Siva,
12
Oczywiście nie zobaczysz dzienników poniżej priorytetu. To minimalny priorytet, który ustawiasz.
Ilya Kogan
19

DEBUG pokaże wszystkie komunikaty, INFO wszystkie oprócz komunikatów DEBUG i tak dalej.
Zwykle używa się INFO lub WARN. Zależy to od polityki firmy.

weismat
źródło
Proszę sprawdzić moje zaktualizowane pytanie, Moje pytanie dotyczy poziomów i logów
Siva,
Proszę opublikuj całą konfigurację log4Net, możesz mieć dwa loggery, które się zakłócają.
weismat
Do tej pory osobiście korzystałem tylko z ustawienia poziomu. Myślę, że jeśli to możliwe, należy unikać ustawień Min / Max.
weismat
Opublikowałem całą konfigurację log4net. Proszę sprawdzić. Próbuję się uczyć i wdrażać.
Siva
16

Oto kod informujący o priorytetach wszystkich poziomów 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
źródło
10

Jak zauważyli inni, zwykle lepiej jest określić minimalny poziom rejestrowania, aby rejestrować ten poziom, a także inne, bardziej surowe. Wygląda na to, że myślisz o poziomach rejestrowania wstecz.

Jeśli jednak chcesz mieć bardziej szczegółową kontrolę nad rejestrowaniem poszczególnych poziomów, możesz powiedzieć log4net, aby rejestrował tylko jeden lub więcej określonych poziomów, używając następującej składni:

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

Lub wykluczyć określony poziom rejestrowania, dodając węzeł „odmów” do filtru.

Możesz ułożyć wiele filtrów razem, aby określić wiele poziomów. Na przykład, jeśli chcesz tylko poziomy WARN i FATAL. Jeśli żądane poziomy były następujące po sobie, bardziej odpowiedni jest LevelRangeFilter.

Dokument referencyjny: log4net.Filter.LevelMatchFilter

Jeśli inne odpowiedzi nie dały ci wystarczających informacji, miejmy nadzieję, że pomoże ci to uzyskać to, czego chcesz z log4net.

ulty4life
źródło
Ach, zaprzeczenie jest tym, czego szukałem. chciałby otrzymywać informacje i komunikaty o błędach, ale nie chciałby debugować. dzięki za to.
Sarfaraaz
by adding a "deny" node to the filterw jaki sposób?
mrhotroad
@mrhotroad Nie jestem pewien, jak różni się obecna wersja log4net od wersji z 2014 roku, ale oto dokument dotyczący LevelMatchFilter.AcceptOnMatch. logging.apache.org/log4net/release/sdk/html/… Więc możesz zrobić <levelToMatch value = "WARN" AcceptOnMatch = "false" />
ulty4life
8

Prawdą jest, że oficjalna dokumentacja ( podręcznik Apache log4net ™ - wprowadzenie ) stwierdza, że ​​istnieją następujące poziomy ...

  • WSZYSTKO
  • ODPLUSKWIĆ
  • INFO
  • OSTRZEC
  • BŁĄD
  • FATALNY
  • POZA

... ale dziwnie, kiedy przeglądam zestaw log4net.dll, zapieczętowana klasa v1.2.15.0 log4net.Core.Level, widzę zdefiniowane następujące poziomy ...

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;

Od dłuższego czasu używam TRACE w połączeniu z PostSharp OnBoundaryEntry i OnBoundaryExit. Zastanawiam się, dlaczego tych innych poziomów nie ma w dokumentacji. Co więcej, jaki jest prawdziwy priorytet na wszystkich tych poziomach?

barrypicker
źródło
2
Co jest warte, wszystkie są wymienione pod poniższym linkiem, ale wydaje się, że od jakiegoś czasu nie aktualizują swoich instrukcji. logging.apache.org/log4net/release/sdk/html/…
Dinerdo
2
Level Fine; Level Finer; Level Finest; Od teraz będę używać tylko tych trzech.
maembe
-3

Spróbuj w ten sposób, to zadziałało dla mnie

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

Rejestruje 3 typy błędów - błąd, informacje i ostrzeżenie

Dhananjay
źródło
7
Zgodnie z dokumentacją log4net dla Root Logger: „poziom: element opcjonalny, maksymalnie jeden dozwolony . Definiuje poziom rejestrowania dla tego rejestratora. Ten rejestrator akceptuje tylko zdarzenia na tym lub wyższym poziomie.
gonadarian,
Dlaczego ta odpowiedź oddała głos? Na mnie też działa. Stąd głosowanie.
amilamad
1
Ponieważ <level value = "WARN" /> wystarczyłoby.
rlesias