gpt4 book ai didi

c# - 日志记录结构 - 当必须记录每个方法时如何构建?

转载 作者:太空宇宙 更新时间:2023-11-03 20:57:15 24 4
gpt4 key购买 nike

我对我们的日志记录看起来有多臃肿有疑问。

我们在这样的结构中记录每个方法:

namespace MyNamespace
{
public class MyClass
{
private readonly ILogger _logger;

public MyClass(ILogger logger)
{
_logger = logger;
}

public string AppendString(string originalText, string addedText)
{
using (new Tracer(_logger).TraceMethod(
"MyNameSpace.MyClass.MyMethod()",
() => new Dictionary<string, object>
{
{"originalText", originalText},
{"addedText", addedText}
}))
{
_logger.WriteInformation("Some extra info");
return originalText + addedText;
}
}
}

public class Tracer : IDisposable
{
private readonly ILogger _logger;
private string _methodName;

public Tracer(ILogger logger)
{
_logger = logger;
}

public Tracer TraceMethod(string methodName, Func<IDictionary<string, object>> arguments)
{
_logger.WriteVerbose($"Entering method {methodName} with arguments {arguments}");
_methodName = methodName;
return this;
}

public void Dispose()
{
_logger.WriteVerbose($"Exiting method {_methodName}");
}
}
}

所以我们要记录:

  • 方法入口 - ALWAYS

  • 方法退出 - 总是

  • 额外信息 - 适当时

但是,如您所见,这个将 2 个字符串合并在一起的微小逻辑变得非常臃肿。在每一个方法中看到这种膨胀是非常令人沮丧的。

我们研究了 Fody 和 Postsharp 等框架中的方面。使用这些框架,我们将能够在所有方法上添加 [LogMethod] 属性,这将自动添加日志记录 OnMethodEntry 和 OnMethodExit。这看起来很有趣,但我们仍然会遇到一些问题。

  1. 我们如何才能在方法到方法的基础上记录我们认为合适的参数?这会有所不同,我们当然不想记录所有输入参数,因为它可能是一个巨大的 xml。我们还希望将这些参数记录在与“OnMethodEntry”日志相同的日志消息中。

  2. 我们仍然需要一个 ILogger 实例作为方法注入(inject)。 ILogger 的实例化添加了一个 session ID。之前设置的这个 sessionId 很重要。有没有办法以不同的方式解决 ILogger?如果我们不将 ILogger 发送到构造函数,我们如何能够使用相同的 ILogger 实例在方法中登录?

最佳答案

PostSharp Diagnostics 通过以下方式解决这些情况:

  1. 参数的“智能”格式化:

    一个。您可以实现 custom formatter并包含您想要的逻辑。但是,格式化程序只会接收参数值,而不是参数元数据。

    如果您的格式化逻辑需要依赖于参数元数据(例如,您定义了一个自定义自定义属性),您可以实现我们所说的custom logging back-end。你将覆盖 SetParameter method .

  2. 使用注入(inject)的 ILogger:

    一个。我真的不建议将记录器作为依赖项注入(inject)。虽然它是正统的,但与面向方面的解决方案一起使用是不切实际的。 PostSharp Diagnostics 在后台为每种类型创建一个 ILogger,而不是为每个实例创建一个。

    如果您选择不注入(inject) ILogger,PostSharp Diagnostics 允许您轻松混合自动日志记录和 manual log records .手动记录将显示在正确的上下文中。

    也就是说,您可以创建一个 custom logging back-end (或适配器)将使用您的实例级 ILogger。你需要将你的记录器暴露给一个接口(interface),比如 ILoggable。然后您的自定义适配器可以使用 ILoggable.ILogger。这没有什么困难。然而,它不能很好地与 2.b 结合,因为使用我们的框架发出的手动日志记录不包含有关 this 实例的信息(从 PostSharp 5.0 开始)。但是,您可以使用自己的 ILogger,而不是使用 PostSharp 的 Logger 类来记录自定义记录。

关于c# - 日志记录结构 - 当必须记录每个方法时如何构建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49183786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com