Конфигурация 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 все должно работать.

Пытаться

<levelToMatch value="WARN" />
Другие вопросы по тегам