log4net иерархия и уровни ведения журнала


127

Этот сайт говорит

Регистраторам могут быть назначены уровни. Уровни являются экземплярами класса log4net.Core.Level. Следующие уровни определены в порядке возрастания приоритета :

  • ВСЕ
  • ОТЛАЖИВАТЬ
  • ИНФОРМАЦИЯ
  • WARN
  • ОШИБКА
  • FATAL
  • OFF

DEBUG имеет самый низкий приоритет, а ERROR - выше.

Вопрос

  • Если я установил Min и Max example DEBUG и ERROR, он распечатает все DEBUG, INFO, WARN и ERROR. Без использования минимального и максимального фильтров. Если я укажу ERROR (уровень ведения журнала = ERROR) Будет ли он включать DEBUG, INFO & WARN
 <filter type="log4net.Filter.LevelRangeFilter">
     <param name="LevelMin" value="ERROR"/>
     <param name="LevelMax" value="ERROR"/>
 </filter>

Вместо фильтра min и max. Можно ли настроить уровень и включить все остальные уровни ниже для ведения журнала.

Пример - Установите уровень как Ошибка, он будет включать ОТЛАДКУ, ИНФОРМАЦИЮ, ПРЕДУПРЕЖДЕНИЕ и ОШИБКУ. Возможно ли это с 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, кажется, имеет самый низкий приоритет, а ошибка - самый высокий. Это не приоритет , но порог выше или выше, сообщение будет зарегистрировано.
R. Schreurs

Вы пробовали только использовать levelMax? Я думаю , что это должно включать в себя все , что ниже его , если вы не укажетеlevelMin
AN

Ответы:


90

Это может помочь понять, что записывается, на каком уровне Регистраторам могут быть назначены уровни. Уровни являются экземплярами класса log4net.Core.Level. Следующие уровни определены в порядке возрастания серьезности - Уровень журнала.

Количество уровней, записанных для каждого уровня настройки:

 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
Вы можете взглянуть на эту часть сайта для правильного форматирования ответов
Джарод Мозер

36

Для большинства приложений вы хотите установить минимальный уровень, но не максимальный.

Например, при отладке кода установите минимальный уровень DEBUG, а в производственной среде - WARN.


Пожалуйста, проверьте мой обновленный вопрос, Мой вопрос касается уровней и отчетов журнала
Шива

Перейдите <level value="ALL" /> на, <level value="WARN" />и вы получите только предупреждения и ошибки.
Илья Коган

2
Нет, это не поможет. Я пытался изменить. Я не видел журналов с включенным приоритетом ниже
Siva

12
Конечно, вы не увидите журналов с приоритетом ниже. Это минимальный приоритет, который вы устанавливаете.
Илья Коган

19

DEBUG покажет все сообщения, INFO - все, кроме сообщений DEBUG, и так далее.
Обычно используется либо ИНФОРМАЦИЯ, либо ПРЕДУПРЕЖДЕНИЕ. Это зависит от политики компании.


Пожалуйста, проверьте мой обновленный вопрос, Мой вопрос касается уровней и отчетов журнала
Шива

Пожалуйста, опубликуйте всю конфигурацию log4Net, возможно, вам мешают два регистратора.
weismat

И я лично пока использовал только настройку уровня. Я думаю, что по возможности следует избегать установки Min / Max.
weismat

Я выложил всю конфигурацию log4net. Пожалуйста, проверьте. Пытаюсь изучить и внедрить.
Siva

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.


ах, отрицание - это то, что я лично искал. хотел бы получить информацию + сообщения об ошибках, но не отладить. Спасибо за это.
Sarfaraaz

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 ™ - Введение ) действительно утверждает, что существуют следующие уровни ...

  • ВСЕ
  • ОТЛАЖИВАТЬ
  • ИНФОРМАЦИЯ
  • WARN
  • ОШИБКА
  • FATAL
  • OFF

... но как ни странно, когда я просматриваю сборку 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
Уровень Fine; Уровень Finer; Уровень Finest; С этого момента я просто буду использовать эти три.
maembe

-3

Попробуйте вот так, у меня это сработало

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

Это регистрирует 3 типа ошибок - ошибка, информация и предупреждение.


7
Согласно документации log4net для Root Logger: «level: необязательный элемент, разрешен максимум один . Определяет уровень ведения журнала для этого регистратора. Этот регистратор будет принимать только события этого уровня или выше »
gonadarian

Почему этот ответ не поддержал? У меня тоже работает. Отсюда голосование.
amilamad

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