我正在使用 Windsor Logging Facility 和 NLog 集成将日志记录添加到项目中。
我没有遵循 Windsor 文档的推荐做法,即向Log
我想要支持日志记录的每个类添加一个属性,而是决定尝试使用动态拦截来完成它。到目前为止,拦截器相当基本;它只是使用构造函数注入来获取以下实例ILogger
:
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
并指示容器使用它。但是我很快遇到了一个障碍:当 Windsor 调用工厂时,提供的唯一信息是获取记录器的对象的类型。没有提供有关该对象的其他信息,因此ILoggerFactory
无法找出拦截器已应用于的抽象。
我注意到有两个ILoggerFactory.Create()
接受字符串作为参数的重载。温莎似乎并没有直接使用它们中的任何一个,但人们会认为它们必须在那里是有原因的。流畅的注册 API 中是否有任何内容可用于指定使用特定字符串?