2013-08-28 76 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

如果直接請求從容器​​(例如與Logger = MvcApplication.Container.Resolve<ILogger>();)溫莎總會給你一個名爲Default默認​​。

可以在配置時與ToLog方法更改此默認名稱LoggingFacility

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

如果你想擁有「當前級記錄儀」,而不是默認的,那麼你需要讓溫莎內噴射您的​​而不是手動解決它。

所以,如果你使用構造器注入:

public MyController 
{ 
    private ILogger logger; 

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

或財產注射:

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

溫莎會爲你創建一個​​用正確的My.NameSpace.MyController名。

如果您需要更細緻的記錄器名稱控制,您可以依賴/解析Castle.Core.Logging.ILoggerFactory接口,並且可以使用該接口創建自己的​​。

+0

所以我必須創建一個安裝程序讓溫莎注入它,對吧? – TGH

+0

不,你不需要任何額外的安裝程序。但是你在談論'ILogger'的安裝程序還是你的'Contoller'? 'LoggingFacility'會自動註冊'ILogger'實例,如果你的'MyController'是一個MVC控制器,那麼它可能已經安裝了... – nemesv

+0

由於某種原因,我不能讓ILogger解決,如果我只是添加一個ILogger控制器上的財產。 – TGH

1

我相信Castle Windsor用你在config中設置的代理和記錄器名稱替換你的類,並且與實際實例類型不匹配。

你可以明確設置日誌的名稱,如

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

額外提示:在許多情況下,解決使用控制反轉不會帶來很多好處,你能避免這樣做記錄,否則你應該調整了,你記錄登記在溫莎城堡。

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().FullNameMyApp.Controllers下)命名記錄器,上面的配置將將調試級別(及以上)條目寫入fileTarget1,並將錯誤級別(及以上)寫入fileTarget1fileTarget3

底線,該*通配符是相當有用的,當你不知道(或者不關心),將使用給定的日誌記錄規則,所以你的情況,這將My.NameSpace下的所有類的工作類型的確切名稱:

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

這對我的作品與Ninject,但據國際奧委會而言,它只是被注入另一依賴,容器不知道這是一個記錄幫手。因此,如果Castle正在生成代理,並且您只需要1個目標,則可以使用Castle.*作爲過濾器。