繁体   English   中英

Serilog 最佳实践与例外

[英]Serilog best practices with exceptions

我在 .NET Core 5 控制台应用程序中使用 Serilog 进行诊断。 我无法确定与异常处理相结合的最佳日志记录语义。 例如,假设我执行一个需要文件存在的操作。 如果该文件不存在,我会出于流程控制的原因抛出异常(我需要展开以正确退出应用程序)。 但是我在哪里以及如何记录这个? 我能想到几个选择:

第一个选项 - 在我投掷之前记录:

if (!File.Exists(myFilePath)) {
  _logger.Error("The file does not exist: {File}", myFilePath);
  throw new ArgumentException("File does not exist", nameof(myFilePath));
}

第二个选项 - 在捕获异常时记录异常:

try {
  if (!File.Exists(myFilePath)) {
    throw new ArgumentException("File does not exist", nameof(myFilePath));
  }
}
catch (Exception e) {
  _logger.Error(e, "An Exception");
}

代码方面,我最喜欢第二种选择。 至于描述性字符串本身,我不会重复自己。 但是,我觉得信息将以不同的方式传达。 我不确定第二个选项的 output 是什么样的:它会被结构化吗? 它缺少第一个选项中的原始日志字符串。

哪种方式最好? 我应该考虑其他选择吗?

我之前已经解决过这个问题,这就是我着陆的地方。 在实践中重复自己可能不是问题:捕获了两个事件,1)配置文件有问题,2)未处理的异常/应用程序退出。

它们是相关的,它们有一点重叠,但它们不是一回事。

想象一下阅读这样的事件:

[ERR] Could not open configuration, the file ./foo.config does not exist
[FTL] An unhandled exception occurred, exiting the application
System.ArgumentException: The file ./foo.config does not exist
 at YourApp.OpenConfig(string filename)
 at ...

第一个事件:出了什么问题? 为什么文件首先被打开? 这是捕获所有详细上下文的地方。

第二个事件:app为什么退出? 由于没有更高级别的处理程序可以处理异常 - blat,所以这一切都在日志中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM