Конфигурация log4net для данного класса не работает
namespace Com.Foo
{
public class Bar
{
private static readonly ILog log = LogManager.GetLogger(typeof(Bar));
public void DoIt()
{
log.Info("Did it again!");
}
}
}
class Program
{
private static readonly ILog log = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
string sfile = @"C:\development\Framework\Logging\ConsoleApplication1\app.config";
XmlConfigurator.Configure(new System.IO.FileInfo(sfile));
log.Info("Entering application.");
Bar bar = new Bar();
bar.DoIt();
log.Info("Exiting application.");
Console.ReadLine();
}
}
Моя конфигурация log4net выглядит следующим образом:
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
<!-- Print only messages of level WARN or above in the package Com.Foo -->
<logger name="Com.Foo">
<level value="WARN" />
</logger>
Вывод моего приложения по-прежнему показывает журнал из Com.Foo
67 [10] INFO ConsoleApplication1.Program (null) - Вход в приложение.
100 [10] INFO ConsoleApplication1.Com.Foo.Bar (null) - Сделал это снова!
100 [10] INFO ConsoleApplication1.Program (null) - Выход из приложения.
Как мне настроить так, чтобы Com.Foo.Bar перестал отображаться на уровне WARN?
Что мне не хватает?
Спасибо
3 ответа
Я только что понял... Я неправильно настраивал регистратор в классе Foo.Bar.
Обновите следующую строку
private static readonly ILog log = LogManager.GetLogger(typeof(Bar));
к следующему..
private static readonly ILog log = LogManager.GetLogger("Com.Foo");
и это сработало.
Конфигурация, которую вы предоставили, должна работать.
Когда вы создаете регистратор Com.Foo.Bar
он наследует настройки от Com.Foo
регистратор в иерархии. Com.Foo
logger наследует свои дополнения от root logger, но имеет собственный уровень, который установлен на WARN
, Таким образом, когда вы пытаетесь написать событие регистрации через Com.Foo.Bar
logger, эффективный уровень будет получен из иерархии - это уровень ближайшего регистратора вверх в дереве иерархии (у корневого регистратора всегда есть уровень). В вашем случае это WARN
, поэтому событие регистрации не будет передано аппендерам.
Я думаю, что ваша конфигурация отличается от того, что вы предоставили. Возможно, вы читаете неправильный файл конфигурации. Попробуйте этот код (будет использоваться файл конфигурации приложения):
XmlConfigurator.Configure();
Или (еще лучше) использовать конфигурацию через атрибут:
[assembly: log4net.Config.XmlConfigurator(Watch=true)]
ОБНОВИТЬ
При смене регистратора извлекается из typeof(Bar)
в "Com.Foo"
работал, тогда вы предоставили нам неправильное пространство имен класса Bar. Потому что log4net за сценой принимает полное имя типа в качестве имени регистратора. Таким образом, с namespace Com.Foo
все должно работать.