当前位置: 首页 > 知识库问答 >
问题:

如何在.NET核心中使用结构化参数记录异常

鲜于仰岳
2023-03-14

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

_logger.LogInformation($"Reading file {path}..."); // bad
_logger.LogInformation("Reading file {Path}...", path); // good

第二个变体的好处是结构化信息:通过使用巧妙的日志事件路由器(如带有RenderedCompactJsonFormatter的Serilog),路径被写为日志事件的单独属性。

随着错误日志记录,情况变得更糟。要求很明显:

  1. 错误作为异常实现。
  2. 在处理错误的catch块中记录了一个错误。
  3. 每个错误都以结构化形式记录。
throw new MyException("Failed to read file {Path}", path);
catch(MyException e)
{
  _logger.LogError(e, "Processing error");
}

这里的LogError方法记录完整的错误描述,但它不是结构化的:路径不是作为属性添加的。我试图让MyException保存消息模板和参数,但这种方法存在2个问题:

  1. 如何基于具有命名参数的模板呈现异常消息?
  2. 在catch块中处理异常时,可以释放参数。

请告诉我你是如何处理这件事的。

共有1个答案

楚举
2023-03-14

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);
}

我认为这是捕捉异常并以结构化的方式记录异常的唯一方法。

 类似资料:
  • 我正在使用Azure函数中相对较新的ILogger(vs.TraceWriter)选项,并试图了解日志是如何捕获的。 以下是我的功能: 当我查看服务器日志时,LogFiles目录有一个层次结构。 结构化目录在这里什么也不包含,但在我的real function applications目录中似乎有各种“CodedDiagnostic”日志语句。 在这里我该期待什么?最终,我希望有一个单一的接收器,

  • 给定以下代码,如何使用最新的JSDoc正确记录它? 我尝试过这个: 显然这不起作用,JSDoc留档提到的只是如何记录去结构化对象参数,而不是去结构化数组参数。

  • 我有多个方法做基本相同的事情,接收一个对象,将字段传递给查询并返回结果。

  • .NET核心和ASP.NET核心到底有什么区别?

  • 我用的是Spark 2.1。 我正在尝试使用 Spark 结构化流从 Kafka 读取记录,反序列化它们并在之后应用聚合。 我有以下代码: 我想要的是将字段反序列化到我的对象中,而不是转换为。 我有一个自定义的反序列化程序。 我如何在Java中做到这一点? 我找到的唯一相关链接是这个 https://databricks.com/blog/2017/04/26/processing-data-in

  • 我注意到,虽然我在代码中设置了