【发布时间】:2021-02-14 09:55:38
【问题描述】:
我找不到在我的 .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 块中处理异常时,可能会释放参数。
请告诉我你是如何处理这个问题的。
【问题讨论】:
标签: c# .net exception logging structured-data