Dot-Net
使用帶有 Log4net 的包裝器類時如何記錄方法名稱
我正在為 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 類關閉登錄,您將無法執行此操作。