2012-05-16 113 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