2009-07-23 4 views
12

Я установил logfileAppender и consoleAppender в моей конфигурации log4net для своего приложения. Я хотел бы, чтобы приложение logfile записывало только сообщения ERROR и выше и консольный appender для записи DEBUG и выше.Порог приращения Log4net не работает

Моя конфигурация является:

<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 и отладочные сообщения выводятся на мой логфайл Appender. Как ограничить его только ОШИБКОЙ?

+0

Пробовали ли вы фильтр я предложил в своем ответе ? Разве это не имело значения? –

+0

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

ответ

8

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

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

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

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

6

Чтобы получить очень специфическую фильтрацию для приложения, вам необходимо настроить 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.

+0

@ Dav.evans, можете ли вы подтвердить, что приведенная выше полная конфигурация? Какие регистраторы вы используете? Определенно ли, что никакие изменения конфигурации не производятся программно в вашем коде? –

+0

тот же вопрос/ответ: http://stackoverflow.com/questions/6007/log4net-configuring-log-level –

0

Необходимо использовать additivity. См. Пример here. Вам нужно определить два регистратора.

+0

Но logfile - это Appender, а аддитивность относится к Loggers. –

+0

Я исправил это. Фактически вы создаете два регистратора, каждый с одним приложением, и используете свойство аддитивности. – kgiannakakis

+0

наверняка нет. Какова же цель порогового элемента? –

2

Ответы, которые вы получаете, отчасти верны. 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 (вы можете увидеть вопрос, который я имел на эту тему here).

+0

Maestrean Это не работает для меня с новейшей версией log4net. – BradLaney

+0

Я использовал это, и он работал в версии 1.2.13.0. –

4

Я создал пример консольного приложения, используя вашу конфигурацию 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: 51387 Главная - System.Exception: журнал Постулаты ошибка

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

2014-01-27 15: 05: 52190 System.Exception: журнал Постулаты ошибка

2014-01-27 15: 05: 52218 отладочный журнал Постулаты

Вот полнота моего файла 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>