[英]Custom PostSharp Logging
將 PostSharp 用於 C# 應用程序,我有以下場景:
DoSomethingMethod調用CustomLoggingMethod ,它以所需格式創建日志條目並且運行良好。 正如預期的那樣,日志條目將源記錄為CustomLoggingMethod ,我更願意覆蓋它以顯示可以從堆棧中獲取的原始調用方法(例如DoSomethingMethod )。 有誰知道我如何通過這種方法實現這一目標?
作為后續行動,有沒有一種方法可以阻止我的自定義日志記錄方法的進入/退出日志條目?
你可以,但以犧牲一些性能為代價。
后續很簡單:您使用[Log(AttributeExclude=false)]
注釋CustomLoggingMethod
,它將不再產生進入/退出的自動記錄。
至於主要問題, LogSource.Get()
和 LogLevelSource 上的.Write
方法都有重載,您可以在其中提供自己的CallerInfo
。 CallerInfo object 包含類型和方法名稱。
您可以做的是以編程方式在您的自定義方法中創建 CallerInfo object 並將其傳遞給這些方法。 您可以從 [CallerMemberName] 獲取方法名稱,但您需要將類型作為參數傳遞。
或者,正如您所說,您可以從堆棧中獲取類型。 您可以使用 CallerInfo.GetDynamic 最輕松地完成此操作,但根據我的經驗,這很慢。 如果您開始每秒記錄數千行,您會發現以這種方式遍歷堆棧會導致性能下降。
下面是自定義方法的樣子:
[Log(AttributeExclude = true)]
public static void CustomLogging(string message)
{
CallerInfo callerInfo = CallerInfo.GetDynamic(1);
LogSource.Get(ref callerInfo).Warning.Write(FormattedMessageBuilder.Formatted(message), default, ref callerInfo);
}
在不使用自定義方法的情況下編寫自定義日志可以避免該問題,因為 PostSharp 重寫了自定義日志調用以在 IL 代碼中包含有關調用者的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.