自定义 PostSharp 日志记录
Custom PostSharp Logging
将 PostSharp 用于 C# 应用程序,我有以下场景:
- Namespace_A.CustomLoggingMethod
- Namespace_B.DoSomethingMethod(实际上是几种不同的方法)
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 代码中包含有关调用者的信息。
将 PostSharp 用于 C# 应用程序,我有以下场景:
- Namespace_A.CustomLoggingMethod
- Namespace_B.DoSomethingMethod(实际上是几种不同的方法)
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 代码中包含有关调用者的信息。