Подтвердить что ты не робот

Не удалось создать порог приложения Log4net

Я установил logfileAppender и consoleAppender в моей конфигурации log4net для своего приложения. Я хотел бы, чтобы приложение logfile записывало только сообщения ERROR и выше и консольный appender для записи 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 выводятся в мой файл файл. Как ограничить его только ОШИБКОЙ?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Я создал пример консольного приложения, используя вашу конфигурацию 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>

Ответ 4

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

Вы хотите реализовать LevelMatchFilter с уровнем "ERROR" (и "DEBUG" для другого приложения). Однако вы также должны добавить 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 (вы можете увидеть вопрос, который у меня был в этом разделе здесь).

Ответ 5

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