gpt4 book ai didi

c# - 如何在 .NET Core 中使用结构化参数记录异常

转载 作者:行者123 更新时间:2023-12-04 08:39:26 25 4
gpt4 key购买 nike

我找不到在我的 .NET Core 微服务中记录异常的一致方法。
信息性消息日志记录指南很简单(使用 Microsoft.Extension.Logging):

_logger.LogInformation($"Reading file {path}..."); // bad
_logger.LogInformation("Reading file {Path}...", path); // good
第二个变体的好处是结构化信息:通过使用巧妙的日志事件路由器(如带有 RenderedCompactJsonFormatter 的 Serilog),路径被写入日志事件的单独属性。
事情变得更糟 错误 日志记录。要求很明显:
  • 错误被实现为异常。
  • 错误记录在处理它的 catch 块中。
  • 每个错误都以结构化的形式记录。

  • 所以,我希望错误报告看起来像
    throw new MyException("Failed to read file {Path}", path);
    和错误记录 - 就像
    catch(MyException e)
    {
    _logger.LogError(e, "Processing error");
    }
    这里的 LogError 方法记录了完整的错误描述,但它不是结构化的:路径没有作为属性添加。
    我试图让 MyException 保存消息模板和参数,但是这种方法有两个问题:
  • 如何基于具有命名参数的模板呈现异常消息?
  • 当在 catch 块中处理异常时,可以处理参数。

  • 请告诉我你是如何处理这个问题的。

    最佳答案

    .NET 中的异常不支持这样的结构化参数。由于您使用的是自定义异常,因此您可以将此功能添加到您自己的异常类中。
    例如:

    public class MyException : Exception
    {
    public object[] Props { get; }

    public MyException()
    {
    }

    public MyException(string message)
    : base(message)
    {
    }

    // Add custom "props" parameter to your exception class
    public MyException(string message, params object[] props)
    : base(message)
    {
    Props = props;
    }

    public MyException(string message, Exception inner)
    : base(message, inner)
    {
    }
    }
    现在在您的代码中,您可以执行以下操作:
    try
    {
    var file = "image.png";
    var path = "./my/path/";
    throw new MyException("Failed to read file '{file}' in path '{path}'", file, path);
    }
    catch (MyException e)
    {
    _logger.LogError(e, e.Message, e.Props);
    }
    如果您查看您的日志(我在这里使用 InvisionLog),那么您应该会看到它是结构化的。
    我认为这是捕获异常并以结构化方式记录它们的唯一方法。
    enter image description here

    关于c# - 如何在 .NET Core 中使用结构化参数记录异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64633751/

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