我正在使用Windsor日誌記錄工具和NLog集成工具將日誌記錄添加到項目中。Windsor日誌記錄工具:控制日誌名稱
我沒有按照Windsor文檔中建議的將Log
屬性添加到每個我想支持日誌記錄的類的做法,而是決定嘗試使用動態攔截來實現它。到目前爲止,攔截器是相當基礎的。它只是使用構造器注入來獲得一個實例:
class LoggingInterceptor : IInterceptor
{
private readonly ILogger _logger;
public LoggingInterceptor(ILogger logger)
{
if (logger == null) throw new ArgumentNullException("logger");
_logger = logger;
}
public void Intercept(IInvocation invocation)
{
// just a placeholder implementation, I'm not actually planning to do this ;)
_logger.Info(invocation.Method.Name);
invocation.Proceed();
}
}
除此之外,所有我所做的就是最小登記攔截,並把它應用到一個組件,日誌工具負責其餘的護理。
container.Register(Component.For<LoggingInterceptor>().LifeStyle.Transient);
container.Register(
Component.For<IEmployeeRepository>()
.ImplementedBy<EmployeeRepository>()
.Interceptors(InterceptorReference.ForType<LoggingInterceptor>()).First);
到目前爲止這麼好 - 有點。我得到的記錄器遵循NLog推薦的每個記錄器的練習。在這種情況下,我不認爲這是一個很好的選擇。這意味着每條消息都會轉到名爲「MyApplication.Interceptors.LoggingInterceptor」的日誌中,這不是非常有用。
我傾向於在記錄器應用到抽象後命名的日誌。例如,如果記錄器已應用於IEmployeeRepository
的實現,則日誌應命名爲EmployeeRepository
。這是可行的嗎?
編輯: 我試過實施自定義ILoggerFactory
並指示容器使用它。然而,我很快遇到了一個障礙:當溫莎召喚進入工廠時,唯一提供的信息是正在採集記錄器的物體的類型。沒有提供有關該對象的其他信息,因此ILoggerFactory
無法找到攔截器已應用到的抽象。
我注意到有兩個接受字符串作爲參數的過載ILoggerFactory.Create()
。溫莎似乎沒有直接使用他們中的任何一個,但有人會認爲他們必須在那裏出於某種原因。流利註冊API中是否有可用於指定使用特定字符串的任何內容?
你的Google-fu顯然比我的好。這應該是完美的 - 唯一的額外細節是獲取一個爲抽象類型而不是具體類型命名的日誌。我想我會通過搜索具體類型的接口來查找遵循約定的接口。 –
很高興我能夠幫助! – wageoghe