Не удалось создать порог приложения 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 выводятся в мой файл файл. Как ограничить его только ОШИБКОЙ?
Ответы
Ответ 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. См. здесь для примера. Вам нужно определить два регистратора.