簡體   English   中英

自定義 PostSharp 日志記錄

[英]Custom PostSharp Logging

將 PostSharp 用於 C# 應用程序,我有以下場景:

  • 命名空間_A。 自定義記錄方法
  • 命名空間_B。 DoSomethingMethod (實際上是幾種不同的方法)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM