自定义 PostSharp 日志记录

Custom PostSharp Logging

将 PostSharp 用于 C# 应用程序,我有以下场景:

DoSomethingMethod 调用 CustomLoggingMethod,它以所需的格式创建日志条目并且运行良好。正如预期的那样,日志条目将源记录为 CustomLoggingMethod,我更愿意覆盖它以显示原始调用方法(例如 DoSomethingMethod),我可以从堆栈中获取。有谁知道我如何通过这种方法实现这一目标?

作为后续行动,有没有办法我也可以仅针对我的自定义日志记录方法阻止 entry/exit 日志条目?

可以,但会牺牲一些性能。

follow-up 很简单:您用 [Log(AttributeExclude=false)] 注释 CustomLoggingMethod,它将不再生成 entry/exit.

的自动记录

至于主要问题,LogSource.Get() 和 LogLevelSource 上的 .Write 方法都有重载,您可以在其中提供自己的 CallerInfo。 CallerInfo 对象包含类型和方法名称。

您可以做的是以编程方式在自定义方法中创建 CallerInfo 对象并将其传递给那些方法。您可以从 [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 代码中包含有关调用者的信息。