看一下Serilog.Exceptions记录的异常详细信息和未在 Exception.ToString() 中输出的自定义属性。
这个库有自定义代码来处理大多数常见异常类型的额外属性,并且只有在 Serilog.Exceptions 内部不支持异常时才回退到使用反射来获取额外信息。
添加 NuGet 包,然后添加丰富器,如下所示:
using Serilog;
using Serilog.Exceptions;
ILogger logger = new LoggerConfiguration()
.Enrich.WithExceptionDetails()
.WriteTo.Sink(new RollingFileSink(
@"C:\logs",
new JsonFormatter(renderMessage: true))
.CreateLogger();
您的 JSON 日志现在将补充详细的异常信息,甚至自定义异常属性。这是从 EntityFramework 记录 DbEntityValidationException 时发生的示例(此异常因具有不包含在 中的深度嵌套的自定义属性而臭名昭著.ToString()
)。
try
{
...
}
catch (DbEntityValidationException exception)
{
logger.Error(exception, "Hello World");
}
上面的代码记录了以下内容:
{
"Timestamp": "2015-12-07T12:26:24.0557671+00:00",
"Level": "Error",
"MessageTemplate": "Hello World",
"RenderedMessage": "Hello World",
"Exception": "System.Data.Entity.Validation.DbEntityValidationException: Message",
"Properties": {
"ExceptionDetail": {
"EntityValidationErrors": [
{
"Entry": null,
"ValidationErrors": [
{
"PropertyName": "PropertyName",
"ErrorMessage": "PropertyName is Required.",
"Type": "System.Data.Entity.Validation.DbValidationError"
}
],
"IsValid": false,
"Type": "System.Data.Entity.Validation.DbEntityValidationResult"
}
],
"Message": "Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.",
"Data": {},
"InnerException": null,
"TargetSite": null,
"StackTrace": null,
"HelpLink": null,
"Source": null,
"HResult": -2146232032,
"Type": "System.Data.Entity.Validation.DbEntityValidationException"
},
"Source": "418169ff-e65f-456e-8b0d-42a0973c3577"
}
}
Serilog.Exceptions支持 .NET 标准并支持许多常见的异常类型而无需反射,但我们想添加更多,所以请随时贡献。
重要提示 - 人类可读的堆栈跟踪
您可以使用Ben.Demystifier NuGet 包来获取人类可读的异常堆栈跟踪,如果您使用的是 Serilog,则可以使用 serilog -enrichers-demystify NuGet 包。