Dot-Net

使用帶有 Log4net 的包裝器類時如何記錄方法名稱

  • September 13, 2019

我正在為 log4.net 實現自定義 XML 格式化程序

public class ISDSApplicationEventsLayout : XmlLayoutBase
{
   protected override void FormatXml(...)
   {
       //Location Info 
       writer.WriteStartElement("Method");
       writer.WriteString(**loggingEvent.LocationInformation.MethodName * *);
       writer.WriteEndElement();
   }
}

問題是……現在當我從我的日誌包裝類呼叫日誌方法時……稱為日誌記錄

public static void logEvent(string message)
{
   log.Info(isdsLog); 
}

我得到輸出….

 <Method>logEvent</Method>

如何將呼叫 logEvent 的方法名稱而不是 logEvent 作為方法名稱?

謝謝

問題更新:

如果上面看起來有點複雜 - 我真正要問的是:你如何保持在 log4net 中呼叫包裝日誌記錄函式的方法的上下文……

範例…方法 doWork()… 呼叫 -> 日誌記錄包裝器 -> 呼叫 log4net ….

你如何使 methodname = doWork 而不是記錄包裝函式….

實際上,您可以使用開箱即用的 log4net 輕鬆解決此問題。您的包裝器可以呼叫 Logger.Log 並將包裝器類的類型作為第一個參數傳遞。因此,您的包裝器可能看起來像這樣:

public class MyLog4NetWrapper
{
 ILog log = LogManager.GetLogger("WhateverYourLoggerNameIs");

 public void logEvent(string message) 
 {     
   log.Logger.Log(typeof(MyLog4NetWrapper), LogLevel.Info, message, null);
 } 
}

當 log4net 記錄一條消息時,它會向上遍歷呼叫堆棧,直到到達聲明類型等於作為 Log 方法的第一個參數傳入的類型的方法。堆棧中的下一個方法是實際呼叫站點。

至於包裝 log4net 記錄器,我不確定我是否會推薦創建一個靜態包裝器類。主要問題是您的 app.config 文件中只能有一個可配置的記錄器。換句話說,您將無法從程式碼的不同部分獨立控制日誌記錄。如果您有 A 類和 B 類並且都使用靜態包裝的記錄器,那麼這兩個類將在同一級別記錄。如果您想為 A 類打開登錄並為 B 類關閉登錄,您將無法執行此操作。

引用自:https://stackoverflow.com/questions/1149844