【问题标题】:log all handled exception using log4net + AutoFac interceptor使用 log4net + AutoFac 拦截器记录所有处理的异常
【发布时间】:2012-05-17 20:51:21
【问题描述】:

我正在使用Log4Net来记录我的应用程序。目前我想记录在我的应用程序中输入的每个方法(用于测试目的)。因此我使用AutoFac 拦截功能,像这样:

builder.Register(c=> new MyClass()).As<IMyInterface>().EnableInterfaceInterceptors().InterceptedBy(typeof(LoggerClass));

builder.Build();

我的LoggerClass 看起来像这样:

public class LoggerClass : StandartInterceptor
{
    ILog _log = LogManager.GetLogger(typeof(LoggerClass));

    override void PreProceed(IInvocation invovation)
    {
         _log.Info(string.Format("entering method: {0}",invocation.Method.Name);
    }
}

目前,此实现将为所有方法调用打印消息(拦截器捕获所有方法条目)。

问题

我想使用这种拦截机制来记录每个处理的异常。 例如,而不是这样编码:

catch (myException ex)
{
     _log.Error(string.Format("catches exception {0}", ex.Message));
}

我将在我的LoggerClass 中有额外的方法来包装 catch 语句并向其注入日志消息。 有没有办法使用Log4Net 来做到这一点?因为基本上拦截器围绕该方法工作,我需要它在方法内部工作。

【问题讨论】:

    标签: c# c#-4.0 log4net autofac


    【解决方案1】:

    在您捕获的异常中,您永远不会进入拦截器的catch 块。

    因此,在您的方法中,当您捕获异常时,您可以在一个额外的拦截方法中处理捕获的异常,该方法将被适当记录。这会使您的代码库膨胀一点,但您最终会在不牺牲架构的情况下获得所需的信息。

    public void InterceptedMethod()
    {
      try
      {
        //Some code that fails.
      }
      catch
      {
         HandleException();
      }
    }
    
    //Intercept this method also
    public void HandleException()
    {
    
    }
    

    【讨论】:

    • ,10 倍的答案。但我有一些问题。我使用拦截器的原因是因为它允许我从一个地方(我的 LoggerClass)配置日志记录策略,所以在我的应用程序稳定后,我就可以从一个地方更改我的策略。例如,如果我想关闭每个 catch 调用的日志记录,我将能够从一个地方执行此操作,而不是清除 catch 语句中的所有调用。
    猜你喜欢
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多