我在我的.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");
}
从代码角度来看,我最喜欢第二个选项。至于描述字符串本身,我不会重复自己。但是,我觉得信息将以不同的方式进行传达。我不确定第二个选项的输出是什么样子的:它是否有结构?它缺少第一个选项中的原始日志字符串。
哪种方法最好?还有其他选项应该考虑吗?
{File}
是如何被放入其中的。当我在第二个表单中记录异常时,它不会知道“File”是什么,对吗? - void.pointerlogger.Error(e, "文件 {File} 不存在", myFilePath)
。 - pinkfloydx33MyFileException.Filename
属性映射到结构化输出字符串中的{File}
吗?那么我就可以这样写..._logger.Error(ex, "无法加载:{File}", ex.Filename)
? - void.pointer