2013-08-28 2 views
3

У меня возникли трудности с настройкой NLog с использованием фильтров имен классов.Фильтр класса NLog не работает

<rules> 
    <logger name="My.NameSpace.MyController" minlevel="Debug" writeTo="file" /> 
    </rules> 

Это не регистрируется, если я указать полное имя класса, но это не будет работать, если я указываю name="*"

Я использую замок Виндзор, чтобы установить это:

Container.AddFacility<LoggingFacility>(f => f.UseNLog("NLog.config")); 

Выполнение этого звонка в классе MyController

Logger = MvcApplication.Container.Resolve<ILogger>(); 

Есть ли что-нибудь еще у меня чтобы указать, чтобы это работало с правилом класса?

ответ

1

Если вы непосредственно с просьбой об ILogger из контейнера (например с Logger = MvcApplication.Container.Resolve<ILogger>();) Виндзор всегда будет давать вам по умолчанию ILogger под названием Default.

Вы можете изменить это имя по умолчанию с помощью метода ToLog когда настраивал LoggingFacility:

container.AddFacility<LoggingFacility>(f => f.UseNLog("NLog.config") 
              .ToLog("MyDefaultname")); 

Если вы хотите, чтобы иметь «текущий регистратор класса» вместо используемого по умолчанию, то вам нужно, чтобы Виндзор впрыскивает ваш ILogger вместо того, чтобы вручную его разрешать.

Так что, если вы используете инъекции конструктора: инъекции

public MyController 
{ 
    private ILogger logger; 

    public MyController(ILogger logger) 
    { 
     this.logger = logger; 
    } 
} 

или свойство:

public MyController 
{ 
    public ILogger Logger { get; set; } 
} 

Windsor создаст ILogger для вас с правильным My.NameSpace.MyController именем.

Если вам нужно более мелкозернистый контроль имен регистраторов, вы можете зависеть/разрешить интерфейс Castle.Core.Logging.ILoggerFactory, и вы можете создать свой собственный ILogger с этим.

+0

Так что мне нужно было бы создать установщика, чтобы Виндзор ввел его, не так ли? – TGH

+0

Нет, вам не нужен дополнительный установщик. Но вы говорите об установщике для «ILogger» или для вашего «Contoller»? Экземпляры «ILogger» автоматически регистрируются «LoggingFacility», и если ваш «MyController» является контроллером MVC, то он, вероятно, уже установлен ... – nemesv

+0

По какой-то причине я не могу заставить ILogger разрешить, если я просто добавлю ILogger свойство на контроллере. – TGH

1

Я считаю, что Castle Windsor заменяет ваш класс именем прокси-сервера и логина, установленным в config, не соответствует фактическому типу экземпляра.

Вы можете явно задать имя бревна как

Logger = LogManager.GetLogger("My.NameSpace.MyController"). 

Extra совет: во многих случаях разрешающих регистратор с помощью инверсии управления не приносит много пользы, и вы можете избежать этого, в противном случае вы должны Tweak до вас регистратор регистрации в замке Виндзор.

0

Если все классы под заданным пространством имен использовать ту же цель, вы можете настроить правила так:

<rules> 
    <logger name="MyApp.Controllers.*" minlevel="Debug" writeTo="fileTarget1" /> 
    <logger name="MyApp.AnotherNamespace.*" minlevel="Debug" writeTo="fileTarget2" /> 
    <logger name="*" minlevel="Error" writeTo="fileTarget3" /> 
</rules> 

Если вы называете ваши регистраторы с GetType().FullName в каждом контроллере (под MyApp.Controllers), то указанная выше конфигурация будет записывать записи уровня отладки (и выше) в fileTarget1 и уровень ошибок (и выше) как на fileTarget1, так и на fileTarget3.

Bottomline, то * подстановочные является чрезвычайно полезным, когда вы не знаете (или заботиться о) точные названия типов, которые будут использовать данное правило ведения журнала, так что в вашем случае это будет работать для всех классов под My.NameSpace:

<logger name="My.NameSpace.*" minlevel="Debug" writeTo="file" /> 

Это работает для меня Ninject, но, насколько это касается IoC это просто другая зависимость впрыскивается, контейнер не знает, что это помощник регистрации. Поэтому, если Castle генерирует прокси-сервер, и вам нужно только 1 цель, вы, возможно, сойдете с Castle.* в качестве своего фильтра.