[英]NLog class filter not working
我使用類名過濾器配置NLog有困難。
<rules>
<logger name="My.NameSpace.MyController" minlevel="Debug" writeTo="file" />
</rules>
如果我指定一個完全限定的類名,它不會記錄,但如果我指定name="*"
它確實有效
我正在使用Castle Windsor來設置它:
Container.AddFacility<LoggingFacility>(f => f.UseNLog("NLog.config"));
在MyController類中進行此調用
Logger = MvcApplication.Container.Resolve<ILogger>();
還有什么我需要指定才能使其與類規則一起使用嗎?
我相信Castle Windsor用您在config中設置的代理和記錄器名稱替換您的類與實際實例類型不匹配。
你可以明確地設置日志的名稱
Logger = LogManager.GetLogger("My.NameSpace.MyController").
額外提示:在許多情況下,使用控制反轉來解析記錄器並沒有帶來很多好處,您可以避免這樣做,否則您應該在Castle Windsor中調整記錄器注冊。
如果您直接從容器中請求ILogger
(例如,使用Logger = MvcApplication.Container.Resolve<ILogger>();
)Windsor將始終為您提供一個名為Default
的默認ILogger
。
配置LoggingFacility
時,可以使用ToLog
方法更改此默認名稱:
container.AddFacility<LoggingFacility>(f => f.UseNLog("NLog.config")
.ToLog("MyDefaultname"));
如果你想擁有“當前類記錄器”而不是默認值,那么你需要讓Windsor注入你的ILogger
而不是手動解析它。
所以如果你使用構造函數注入:
public MyController
{
private ILogger logger;
public MyController(ILogger logger)
{
this.logger = logger;
}
}
或財產注入:
public MyController
{
public ILogger Logger { get; set; }
}
Windsor將使用正確的My.NameSpace.MyController
名稱為您創建一個ILogger
。
如果您需要對記錄器名稱進行更精細的控制,您可以依賴/解析Castle.Core.Logging.ILoggerFactory
接口,您可以使用它創建自己的ILogger
。
如果給定命名空間下的所有類都使用相同的目標,則可以像下面這樣配置規則:
<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
。
在底線時, *
通配符在您不知道(或關心)將使用給定日志記錄規則的類型的確切名稱時非常有用,因此在您的情況下,這適用於My.NameSpace
下的所有類:
<logger name="My.NameSpace.*" minlevel="Debug" writeTo="file" />
這適用於Ninject,但就IoC而言,它只是注入了另一個依賴項,容器不知道它是一個日志助手。 因此,如果Castle生成代理並且您只需要1個目標,那么您可以使用Castle.*
作為您的過濾器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.