在C#应用程序中使用PostSharp,我有以下情形:
DoSomethingMethod 调用 CustomLoggingMethod ,它以所需格式创建日志条目,并且运行良好。如预期的那样,日志条目将源日志记录为 CustomLoggingMethod ,而我希望覆盖它以显示原始调用方法(例如 DoSomethingMethod ),我可以从堆栈。有人知道我可以通过这种方法实现这一目标吗?
作为后续措施,我是否也只能阻止自定义日志记录方法的进入/退出日志条目?
答案 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代码中包括有关调用方的信息。