2016-08-20 63 views
1

我有一個圖案佈局設置爲:忽略目前的方法上的log4net

<param name="ConversionPattern" value="[%-5level]%date %class.%M - %message%newline" /> 

,讓我來記錄類和當前日誌執行的方法名。

然而,我創建了一個靜態方法來執行一些邏輯爲ILog的方法,使得本地我可以登錄作爲信息和其他環境作爲調試水平

[StringFormatMethod("msg")] 
    public static void DebugOrInfoFormat(this ILog log, string msg, params object[] parameters) { 
     if (ApplicationConfiguration.IsLocal()) { 
      log.InfoFormat(msg, parameters); 
     } else { 
      log.DebugFormat(msg, parameters); 
     } 
    } 

事情是,這樣,上輸出我會得到DebugOrInfoFormat而不是調用它的調用方法,使它很混亂,因爲這個方法是打算在很多地方使用。

的問題是:

是否有可以放置在該方法螞蟻屬性,這樣log4net的忽略對堆棧跟蹤方法?

已經試過,沒有運氣

[System.Diagnostics.DebuggerHidden] 
    [System.Diagnostics.DebuggerNonUserCode] 

由於

回答

1

另一種方法將是使用堆棧跟蹤和獲取調用方法,然後自定義創建日誌消息。事情是這樣的:

StackTrace st = new StackTrace(true); 
StackFrame sf = st.GetFrame(1); 
//build your message 
string newMessage = string.Format("{0} at {1} in {2}:line {3}", msg, sf.GetMethod().ToString(), sf.GetFileName(), sf.GetFileLineNumber()); 
if (ApplicationConfiguration.IsLocal()) 
{ 
    _logger.Info(newMessage); 
} 
else 
{ 
    _logger.Debug(newMessage); 
} 

其中_logger聲明爲:

private static ILog _logger = LogManager.GetLogger(typeof(Logger)); 
+0

感謝。 只是想知道這是否會帶來不錯的性能影響,如果我們談論的是經常執行的方法。 我會給它一個鏡頭。 –

+0

我不認爲應該有性能影響,因爲log4net也使用System.Diagnostics。 – FortyTwo