如何为ILogger拦截拦截器

如何为ILogger拦截拦截器

问题描述:

我正在使用LoggingFacility,并且需要为由设施创建的ILogger实例添加拦截器。如何为ILogger拦截拦截器

到目前为止,我试图修改ILogger的组件模型,但这不起作用,因为记录器没有真正使用标准解析机制解析(它们是由工厂创建的,它使用一些包装器)。

我想覆盖日志subresolver,但kernel.Resolver不允许替换(或包装)由设施添加的解析器。

我正在考虑挂钩到Kernel.DependencyResolving,但它似乎我不能取代那里的依赖关系。

什么是放这样一个钩子最合适的地方,所以我可以为ILogger添加Interceptor。

编辑:经过大量的戳动,我带来了一些“hackish”的解决方案,这不幸取决于小反射的使用。

真正的问题似乎是,记录器的构造方式并不遵循(对我来说)城堡的做事精神。即解析器不使用已经注册的记录器工厂,所以不可能为工厂本身添加拦截器。

+0

可能这个副本:http://*.com/questions/25790258/intercept-or-decorate-calls-to-ilogger –

在CodeProject上有一篇很棒的文章:Aspect Oriented Programming (AOP) in C# using Castle DynamicProxy from Linjith Kunnon。它表明你如何定义拦截

public class LoggingInterceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     var methodName = invocation.Method.Name; 
     try 
     { 
      Console.WriteLine(string.Format("Entered Method:{0}, Arguments: {1}", methodName, string.Join(",", invocation.Arguments))); 
      invocation.Proceed(); 
      Console.WriteLine(string.Format("Sucessfully executed method:{0}", methodName)); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(string.Format("Method:{0}, Exception:{1}", methodName, e.Message)); 
      throw; 
     } 
     finally 
     { 
      Console.WriteLine(string.Format("Exiting Method:{0}", methodName)); 
     } 
    } 
} 

以及如何与Castle.Windsor

kernel.Register(
    Component.For<LoggingInterceptor>() 
     .ImplementedBy<LoggingInterceptor>() 
    ); 

kernel.Register(
    Component.For<IRocket>() 
     .ImplementedBy<Rocket>() 
     .Interceptors(InterceptorReference.ForType<LoggingInterceptor>()).Anywhere 
    ); 

注册它请注意,链接的文章中更有价值的内容和这里所有提供的代码是来自文章而不是来自我。所有的荣誉都归Linjith Kunnon所有。

+0

谢谢,但这并不代表问题。我知道如何添加拦截器,但我特别提到了LoggingFacility,它实际上并未在容器中注册ILogger,但使用自己的解析器。 –

您需要创建自己的记录器工厂(从默认实现衍生匹配您的日志框架),然后就可以设置设施使用这个工厂是这样的:

container.AddFacility<LoggingFacility>(f => f.UseLog4Net().LogUsing<MyFactory>()); 

查看完整的例子here

+0

谢谢,这解决了一个具体实现的问题。我采用了更通用的方法 - 为log4net和nlog工作。 –

+0

@SunnyMilenov那么问题是关于如何将拦截器挂钩到ILogger。方法是使用自定义记录器工厂。工厂实施的是另一回事。你当然可以完全保留'UseLog4Net'调用,只需使用'LogUsing ()'并将你自己实现的'ILoggerFactory'作为装饰器实现,实现你想要的具体实现...... –