Порог приложения Log4net не работает

Я настроил logfileAppenderи consoleAppenderв моей конфигурации log4net для моего приложения. Я бы хотел, чтобы приложение logfile писало только сообщения об ОШИБКАХ и выше, а приложение консоли - как DEBUG и выше.

Мой конфиг:

<log4net debug="false">

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
  <param name="File" value="log.txt" />
  <param name="AppendToFile" value="true" />
  <layout type="log4net.Layout.PatternLayout,log4net">
    <param name="ConversionPattern" value="%d %M - %m%n" />
  </layout>
  <threshold value="ERROR"/>
</appender>

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"   >
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%d %m%n" />
  </layout>
</appender>


<root>
  <priority value="DEBUG" />
  <appender-ref ref="ConsoleAppender" />
  <appender-ref ref="LogFileAppender" />
</root>

</log4net>

Я обнаружил, что и ERROR, и DEBUG выводятся моему приложению файла журнала. Как ограничить это только ОШИБКА?

23.07.2009 11:55:01
Вы пробовали фильтр, который я предложил в моем ответе? Разве это не имеет значения?
Vinay Sajip 23.07.2009 15:45:19
Я создал пример консольного приложения, используя вашу конфигурацию log4net, и я получаю точное поведение, которое вам, по-видимому, нужно ... см. Мой ответ ниже.
Darragh 28.01.2014 13:11:58
5 ОТВЕТОВ
РЕШЕНИЕ

Также обратите внимание, что levelтег в регистраторе не работает так же, как thresholdили LevelMatchFilter.

Levelуказывает, какие записи журнала, которые на самом деле будут сгенерированы. Это то, что вы можете проверить в своем коде.

Threshold с другой стороны, отфильтровывает все сообщения журнала, которые падают ниже вашего порога.

Это означает, что не имеет смысла иметь порог, который выше, чем самый высокий уровень регистратора. Я много раз видел, как установить уровень INFO (потому что именно это будет использовать большинство приложений), а затем создать приложение с порогом DEBUG. И затем вы удивляетесь, когда на устройстве не появляются сообщения DEBUG ...

10
29.12.2011 11:30:41

Чтобы получить очень специфическую фильтрацию для appender, вам нужно настроить a LevelMatchFilterили a LevelRangeFilterдля app logfile, чтобы фильтровать события, которые фактически выводятся.
Например:

<filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="ERROR"/>
    <levelMax value="FATAL"/>
</filter>

или

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

поместите один из них в ваш <appender>тег, и это должно работать для вас:

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
    <filter type="log4net.Filter.LevelMatchFilter">
        <levelToMatch value="ERROR"/>
    </filter>
    <param name="File" value="log.txt" />
    <param name="AppendToFile" value="true" />
    <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d %M - %m%n" />
    </layout>
    <threshold value="ERROR"/>
</appender>

Примечание: Обновлено, чтобы убрать ошибку, указанную kgiannakakis.

6
15.10.2013 15:31:59
@ Dav.evans, можете ли вы подтвердить, что приведенное выше является полной конфигурацией? Какие регистраторы вы используете? Определенно ли, что в вашем коде программные изменения не вносятся?
Vinay Sajip 23.07.2009 15:25:48
dave thieben 26.03.2011 22:36:51

Вам нужно использовать свойство аддитивности . Смотрите здесь для примера. Вам нужно определить два регистратора.

0
23.07.2009 13:21:08
Но logfile - это Appender, и аддитивность относится к Loggers.
Vinay Sajip 23.07.2009 13:12:01
Я исправил это. Вы фактически создаете два регистратора, каждый с одним appender, и используете свойство additivity.
kgiannakakis 23.07.2009 13:21:58
конечно нет. Какова цель порогового элемента тогда?
Dav Evans 23.07.2009 13:35:55
Ты пробовал это? LogFileAppender по умолчанию наследует свои родительские (корневые) приложения, поэтому по умолчанию печатает сообщения DEBUG. Попробуйте установить приоритет root в ERROR, чтобы увидеть, что происходит.
kgiannakakis 23.07.2009 14:07:00
@kgiannakakis, это не правильно - регистраторы не являются Appenders. Поскольку appenders присоединены к корневому регистратору, события, зарегистрированные в каждом регистраторе, будут обрабатываться этими приложениями, если только аддитивность определенного регистратора не установлена ​​в false, в этом случае события в этом регистраторе и ниже не будут обрабатываться. В таком случае должен работать рабочий порог - что заставляет меня думать, что, возможно, не вся информация была опубликована?
Vinay Sajip 23.07.2009 15:24:16

Ответы, которые вы получаете, частично верны. Используется Thresholdтолько для установки нижнего предела добавляемого уровня. Пороговое значение ERROR фактически получит ERROR и FATAL (что выше ERROR).

Вы хотите реализовать LevelMatchFilterсо значением уровня «ОШИБКА» (и «ОТЛАДКА» для другого приложения). Однако вы также должны добавить DenyAllFilterв конец цепочки фильтров.
Например:

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
  <param name="File" value="log.txt" />
  <param name="AppendToFile" value="true" />
  <layout type="log4net.Layout.PatternLayout,log4net">
    <param name="ConversionPattern" value="%d %M - %m%n" />
  </layout>
  <filter type="log4net.Filter.LevelMatchFilter">
    <levelToMatch value="ERROR" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
</appender>

Мне пришлось реализовать DenyAllFilter начиная с log4net 1.2.10 (вы можете увидеть вопрос, который у меня возник по этой теме здесь ).

3
23.05.2017 12:17:25
Maestrean Это не работает для меня с последней версией log4net.
BradLaney 22.07.2014 18:22:06
Неважно, сколько лет, ты мой герой!
Eliyah 9.10.2019 20:48:25

Я создал пример консольного приложения, используя вашу конфигурацию log4net, и я получаю точное поведение, которое вы, кажется, хотите ....

using System;
using System.IO;
using log4net;
using log4net.Config;

namespace SO_1171258
{
    class Program
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(Program));

        static void Main()
        {
            XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString()));
            log.Error(new Exception("error log statment"));
            log.Debug("debug log statment");
        }
    }
}

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

2014-01-27 15: 02: 51,387 Main - System.Exception: регистрация журнала ошибок

И на экране я вижу:

2014-01-27 15: 05: 52,190 System.Exception: регистрация журнала ошибок

2014-01-27 15: 05: 52,218 отладочный журнал

Вот весь мой файл app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <log4net debug="false">

    <appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
      <param name="File" value="log.txt" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d %M - %m%n" />
      </layout>
      <threshold value="ERROR"/>
    </appender>

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"   >
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d %m%n" />
      </layout>
    </appender>


    <root>
      <priority value="DEBUG" />
      <appender-ref ref="ConsoleAppender" />
      <appender-ref ref="LogFileAppender" />
    </root>

  </log4net>
</configuration>
5
27.01.2014 15:16:08