log4net ієрархія та рівні реєстрації


127

Цей сайт пише

Лісорубам можуть бути призначені рівні. Рівні - це екземпляри класу log4net.Core.Level. Наступні рівні визначаються в порядку підвищення пріоритетності :

  • ВСІ
  • НАЛАГОДЖУВАТИ
  • ІНФО
  • УВАГА
  • ПОМИЛКА
  • FATAL
  • ВИКЛ

Здається, що DEBUG має найнижчий пріоритет, а помилка - вища.

Питання

  • Якщо я наведіть приклад Min та Max DEBUG та ERROR, він надрукує все, що DEBUG, INFO, WARN і ERROR. Без використання мінімуму та макс. Фільтра. Якщо я вкажу ERROR (logging level = ERROR) Чи буде вона включати DEBUG, INFO & WARN
 <filter type="log4net.Filter.LevelRangeFilter">
     <param name="LevelMin" value="ERROR"/>
     <param name="LevelMax" value="ERROR"/>
 </filter>

Замість min та max filter. Чи можливо налаштувати рівень і включити всі інші рівні під ним для ведення журналів.

Приклад - встановіть рівень як помилку, він буде включати DEBUG, INFO, WARN та ERROR. Чи можливо це за допомогою log4net?

Опублікування конфігурації log4net на основі одного з коментарів:

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


Ви намагалися встановити рівень реєстрації в INFO і перевірили, чи він містить INFO та DEBUG?
за замовчуванням

5
Здається, DEBUG має найнижчий пріоритет, а помилка - найвища. Це не пріоритет , але поріг вгору або вище повідомлення буде записано.
Р. Шреурс

Ви пробували лише використовувати levelMax? Я думаю, що це повинно включати все, що знаходиться під ним, якщо ви не вкажетеlevelMin
AN

Відповіді:


90

Це може допомогти зрозуміти, що записано на якому рівні Логгерам можуть бути призначені рівні. Рівні - це екземпляри класу log4net.Core.Level. Наступні рівні визначаються в порядку збільшення суворості - Log Log.

Кількість рівнів, записаних для кожного рівня налаштування:

 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
Вибачте, я подумав, що це wswg, чому це не ??
Мел Пама

1
Ви можете подивитися на цій частині сайту для правильного форматування відповідей
Jarod Moser

36

У більшості програм ви хочете встановити мінімальний, але не максимальний.

Наприклад, при налагодженні коду встановіть мінімальний рівень DEBUG, а у виробництві встановіть його WARN.


Будь ласка, перевірте моє оновлене запитання, моє запитання щодо рівнів та заяв журналу
Siva

Перейдіть <level value="ALL" /> на <level value="WARN" />і ви отримаєте лише попередження та помилки.
Ілля Коган

2
Ні, це не допомагає. Я намагався змінити. Я не бачив журналів із нижчим пріоритетом
Siva

12
Звичайно, ви не побачите журнали нижче пріоритету. Це мінімальний пріоритет, який Ви встановлюєте.
Ілля Коган

19

DEBUG покаже всі повідомлення, INFO всі, крім повідомлення про DEBUG, тощо.
Зазвичай використовується INFO або WARN. Це залежить від політики компанії.


Будь ласка, перевірте моє оновлене запитання, моє запитання щодо рівнів та заяв журналу
Siva

Будь ласка, опублікуйте всю конфігурацію log4Net, у вас можуть бути два реєстратори, які заважають.
weismat

І я досі особисто використовував лише встановлення рівня. Я думаю, що можливо, слід уникати налаштувань Min / Max, якщо це можливо.
weismat

Я опублікував цілу конфігурацію log4net. Будь ласка, перевірте. Я намагаюся вчитися та впроваджувати.
Сіва

16

Ось код, який розповідає про пріоритет усіх рівнів 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

Як зазначали інші, зазвичай бажано вказати мінімальний рівень реєстрації для того, щоб зареєструвати цей рівень, та будь-які інші, більш суворі за нього. Схоже, ви просто замислюєтесь про рівні журналу назад.

Однак, якщо ви хочете отримати більш тонкий контроль над веденням журналу окремих рівнів, ви можете сказати log4net для реєстрації лише одного або декількох конкретних рівнів, використовуючи наступний синтаксис:

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

Або виключити певний рівень реєстрації, додавши до фільтра вузол "відхилити".

Ви можете складати кілька фільтрів разом, щоб вказати кілька рівнів. Наприклад, якщо ви хотіли лише рівня WARN і FATAL. Якщо потрібні рівні були послідовними, то LevelRangeFilter є більш підходящим.

Довідковий документ: log4net.Filter.LevelMatchFilter

Якщо інші відповіді не дали вам достатньо інформації, сподіваємось, це допоможе вам отримати те, що ви хочете, з log4net.


ах заперечення - це те, що я особисто шукав. хотілося б, щоб інформація + повідомлення про помилки, але не налагоджувати. спасибі за це.
Сарфарааз

by adding a "deny" node to the filterяк?
mrhotroad

@mrhotroad Я не впевнений, чим відрізняється поточна версія log4net від версії 2014 року, але ось документ про LevelMatchFilter.AcceptOnMatch. logging.apache.org/log4net/release/sdk/html/… Отже, ви можете зробити <levelToMatch value = "WARN" AcceptOnMatch = "false" />
ulty4life

8

В офіційній документації ( посібник Apache log4net ™ - вступ ) справді зазначено, що існують наступні рівні ...

  • ВСІ
  • НАЛАГОДЖУВАТИ
  • ІНФО
  • УВАГА
  • ПОМИЛКА
  • FATAL
  • ВИКЛ

... але як не дивно, коли я переглядаю збірку log4net.dll, v1.2.15.0 запечатаний клас log4net.Core.Level, я бачу такі рівні, що визначені ...

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;

Я давно використовую TRACE спільно з PostSharp OnBoundaryEntry та OnBoundaryExit. Цікаво, чому цих інших рівнів немає в документації. Крім того, що є справжнім пріоритетом усіх цих рівнів?


2
Для чого це все, вони перераховані за наступним посиланням, але вони не оновлювали свої посібники протягом певного часу, здається. logging.apache.org/log4net/release/sdk/html/…
Dinerdo

2
Рівень тонкий; Рівень фініш; Рівень Finest; Я просто зараз буду використовувати ці три.
maembe

-3

Спробуйте так, це працювало для мене

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

Цей журнал записує 3 типи помилок - помилку, інформацію та попередження


7
Згідно з документами log4net для Root Logger: "level: Необов'язковий елемент, максимум один дозволений . Визначає рівень журналу для цього реєстратора. Цей реєстратор прийме лише події, що знаходяться на цьому рівні або вище ".
gonadarian

Чому ця відповідь дала голос? Це працює і для мене. Звідси і голосування.
аміламад

1
Тому що <level value = "WARN" /> було б достатньо.
rlesias
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.