2012-05-16 142 views
2

我使用Log4Net登录我的应用程序的所有处理的例外。目前我想记录每个方法进入我的应用程序(用于测试目的)。为此我使用AutoFac拦截能力,somethong这样的:日志使用的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办呢?因为拦截器基本上是围绕这个方法工作的,我需要它在方法内部工作。

回答

0

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

因此,在你的方法,当你捕获异常,您可以处理捕获的异常中,将获得适当的记录额外的拦截方法。这将抬高你的代码一点,但你最终会得到你想要的信息,而不会牺牲你的架构。

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

//Intercept this method also 
public void HandleException() 
{ 

} 
+0

,10倍以上你的回答。但我有一些问题。我使用拦截器的原因是因为它允许我从一个地方(我的LoggerClass)配置日志记录策略,所以在我的应用程序稳定后,我将能够从一个地方更改我的策略。例如,如果我想关闭日志记录,每次接听电话,我都可以从一个地方访问,而不是清除catch语句中的所有呼叫。 – doubleM