【问题标题】:Custom PostSharp Logging自定义 PostSharp 日志记录
【发布时间】:2020-08-17 19:42:22
【问题描述】:

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

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

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

作为后续措施,我是否还可以仅针对我的自定义日志记录方法阻止进入/退出日志条目?

【问题讨论】:

    标签: c# postsharp


    【解决方案1】:

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

    后续很简单:你用[Log(AttributeExclude=false)]注释CustomLoggingMethod,它就不会再产生进入/退出的自动记录了。

    至于主要问题,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 代码中包含有关调用者的信息。

    【讨论】:

    • Petr - 这正是我想要的。我无法告诉你我为实现这一目标努力了多长时间。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 2016-08-29
    • 2019-11-15
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多