自定义PostSharp日志记录

时间:2020-08-17 19:42:22

标签: c# postsharp

在C#应用程序中使用PostSharp,我有以下情形:

  • 名称空间_A。 CustomLoggingMethod
  • Namespace_B。 DoSomethingMethod (实际上是几种不同的方法)

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

作为后续措施,我是否也只能阻止自定义日志记录方法的进入/退出日志条目?

1 个答案:

答案 0 :(得分:1)

可以,但是要牺牲一些性能。

后续操作很容易:您用CustomLoggingMethod注释[Log(AttributeExclude=false)],它将不再产生进入/退出的自动日志记录。

对于主要问题,LogLevelSource上的LogSource.Get().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代码中包括有关调用方的信息。