Serilog.Exceptions 8.4.0

前缀已保留
此包的 SemVer 2.0.0 包版本号为:8.4.0+build.694。
dotnet add package Serilog.Exceptions --version 8.4.0                
NuGet\Install-Package Serilog.Exceptions -Version 8.4.0                
该命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用了 NuGet 模块的 Install-Package 版本。
<PackageReference Include="Serilog.Exceptions" Version="8.4.0" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中以引用该包。
paket add Serilog.Exceptions --version 8.4.0                
#r "nuget: Serilog.Exceptions, 8.4.0"                
#r 指令可用于 F# Interactive 和 Polyglot Notebooks。将此复制到交互式工具或脚本的源代码中以引用该包。
// Install Serilog.Exceptions as a Cake Addin
#addin nuget:?package=Serilog.Exceptions&version=8.4.0

// Install Serilog.Exceptions as a Cake Tool
#tool nuget:?package=Serilog.Exceptions&version=8.4.0                

Serilog.Exceptions Banner

Serilog.Exceptions NuGet Package Serilog.Exceptions package in serilog-exceptions feed in Azure Artifacts Serilog.Exceptions NuGet Package Downloads Twitter URL Twitter Follow

Serilog.Exceptions 是 Serilog 的一个插件,用于记录异常细节和未在 Exception.ToString() 中输出的自定义属性。

它做什么?

您的JSON日志将现在补充详细的异常信息和自定义异常属性。以下是一个当您从EntityFramework(此异常因具有深度嵌套的自定义属性而著名,而这些属性不包括在.ToString()中)记录DbEntityValidationException时发生的情况的示例。

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"
  }
}

入门指南

使用NuGet包管理器或按照以下命令在包控制台窗口中运行操作来将Serilog.Exceptions NuGet包添加到您的项目中:

dotnet add package Serilog.Exceptions

在设置您的日志记录器时,请添加类似以下的WithExceptionDetails()行:

using Serilog;
using Serilog.Exceptions;

ILogger logger = new LoggerConfiguration()
    .Enrich.WithExceptionDetails()
    .WriteTo.RollingFile(
        new JsonFormatter(renderMessage: true), 
        @"C:\logs\log-{Date}.txt")    
    .CreateLogger();

请确保输出格式的sink生成了增强属性。《Serilog.Sinks.Console》以及许多其他默认不执行此操作。您可能需要将{Properties:j}添加到sink的格式模板中。例如,控制台sink的配置可能如下所示:

.WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception} {Properties:j}")

JSON appSettings.json 配置

除了流式配置设置外,还可以使用Serilog.Settings.Configuration存储在应用程序配置中

{
  "Serilog": {
    "Using": [ "Serilog.Exceptions" ],
    "Enrich": [ "WithExceptionDetails" ],
    "WriteTo": [
      { "Name": "Console" }
    ]
  }
}

性能

此库具有针对大多数常见异常类型额外属性的自定义代码,并且只有当异常不是由Serilog.Exceptions内部支持时才回退到使用反射以获取额外信息。虽然存在反射开销,但还是很小的,因为所有昂贵的基于反射的操作仅在每个异常类型上执行一次。

附加破坏者

Serilog.Exceptions.SqlServer

Serilog.Exceptions.SqlServer NuGet Package Serilog.Exceptions.SqlServer package in serilog-exceptions feed in Azure Artifacts Serilog.Exceptions.SqlServer NuGet Package Downloads

Serilog.Exceptions.SqlServer NuGet包添加到您的项目中,以避免使用System.Data.SqlClient时基于反射的破坏器SqlException

Install-Package Serilog.Exceptions.SqlServer

在设置期间添加SqlExceptionDestructurer

.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder()
    .WithDefaultDestructurers()
    .WithDestructurers(new[] { new SqlExceptionDestructurer() }))

Serilog.Exceptions.MsSqlServer

Serilog.Exceptions.MsSqlServer NuGet Package Serilog.Exceptions.MsSqlServer package in serilog-exceptions feed in Azure Artifacts Serilog.Exceptions.MsSqlServer NuGet Package Downloads

Serilog.Exceptions.MsSqlServer NuGet包添加到您的项目中,以避免使用Microsoft.Data.SqlClient时基于反射的破坏器SqlException

Install-Package Serilog.Exceptions.MsSqlServer

在设置期间添加SqlExceptionDestructurer

.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder()
    .WithDefaultDestructurers()
    .WithDestructurers(new[] { new SqlExceptionDestructurer() }))

Serilog.Exceptions.EntityFrameworkCore

Serilog.Exceptions.EntityFrameworkCore NuGet Package Serilog.Exceptions.EntityFrameworkCore package in serilog-exceptions feed in Azure Artifacts Serilog.Exceptions.EntityFrameworkCore NuGet Package Downloads

警告:在Serilog.Exceptions <8.0.0旧版本的版本中,如果使用EntityFrameworkCore与Serilog.Exceptions,则必须添加此设置,否则在某些情况下,将记录整个数据库!这是因为Entity Framework Core中的异常具有链接到整个数据库模式的属性(请参阅#100aspnet/EntityFrameworkCore#15214)。Serilog.Exceptions的新版本通过防止破坏实现IQueryable的属性来解决此问题,从而避免其执行。

当在项目中使用EntityFrameworkCore时,将Serilog.Exceptions.EntityFrameworkCore NuGet包添加到您的项目中

Install-Package Serilog.Exceptions.EntityFrameworkCore

在设置期间添加DbUpdateExceptionDestructurer

.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder()
    .WithDefaultDestructurers()
    .WithDestructurers(new[] { new DbUpdateExceptionDestructurer() }))

Serilog.Exceptions.Refit

Serilog.Exceptions.Refit NuGet Package Serilog.Exceptions.Refit package in serilog-exceptions feed in Azure Artifacts Serilog.Exceptions.Refit NuGet Package Downloads

Serilog.Exceptions.Refit NuGet包添加到您的项目中,以提供使用Refit时对ApiException的详细日志记录

Install-Package Serilog.Exceptions.Refit

在设置期间添加ApiExceptionDestructurer

.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder()
    .WithDefaultDestructurers()
    .WithDestructurers(new[] { new ApiExceptionDestructurer() }))

根据您的Serilog设置,常见的System.Exception属性可能已经被记录。要排除这些属性的记录,请使用重载构造函数,如下所示:

.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder()
    .WithDefaultDestructurers()
    .WithDestructurers(new[] { new ApiExceptionDestructurer(destructureCommonExceptionProperties: false) }))

默认配置记录以下ApiException属性:

  • Uri
  • StatusCode

此外,可以通过以下设置记录ApiException.Content属性:

.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder()
    .WithDefaultDestructurers()
    .WithDestructurers(new[] { new ApiExceptionDestructurer(destructureHttpContent: true) }))

请注意此选项,因为HTTP正文可能非常大,或者包含敏感信息。

Serilog.Exceptions.Grpc

Serilog.Exceptions.Grpc NuGet Package
Serilog.Exceptions.Grpc NuGet Package Downloads

Serilog.Exceptions.Grpc NuGet包添加到您的项目中,以避免在Grpc.Net.Client中使用时基于反射的RpcException解构器。

Install-Package Serilog.Exceptions.Grpc

在设置期间添加RpcExceptionDestructurer

.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder()
    .WithDefaultDestructurers()
    .WithDestructurers(new[] { new RpcExceptionDestructurer() }))

自定义异常解构器

您可能想在不依赖反射的情况下支持解构您自己的异常。为此,创建实现ExceptionDestructurer的自定义解构类。有关ArgumentException的示例,您可以查看此代码,然后简单添加如下

.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder()
    .WithDefaultDestructurers()
    .WithDestructurers(new[] { new MyCustomExceptionDestructurer() }))

如果您编写了解构器,该解构器不包含在此项目(甚至第三方库)中,请贡献它。

其他配置

您可以通过在设置期间传递自定义解构选项来配置解构过程的某些附加属性

.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder()
    .WithDefaultDestructurers()
    .WithRootName("Exception"))

当前支持以下选项

  • RootName:保存解构异常的属性名称,默认为ExceptionDetail
  • Filter:实现IExceptionPropertyFilter的对象,在将属性放置到解构异常对象之前有机会过滤它们。有关详细信息,请参阅“过滤属性”部分。
  • DestructuringDepth:基于反射的递归解构过程的最大深度。
  • ReflectionBasedDestructurer:默认启用基于反射的解构器,但在您想完全控制解构过程的情况下也可以禁用。您将必须显式为所有异常注册解构器。

过滤属性

您可能想跳过您所有的异常类中的一些属性,而不直接创建或修改自定义解构器。Serilog.Exceptions使用过滤器支持此功能。

最常见的用例是需要跳过StackTraceTargetSite。Serilog已经报告了它们,因此您可能想让Serilog.Exceptions跳过它们以节省空间和处理时间。要这样做,您只需修改配置中的一行即可

.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder().WithFilter(someFilter));

支持其他场景的过滤

  • 如果您需要过滤其他一组命名的属性,请使用WithIgnoreStackTraceAndTargetSiteExceptionFilter
  • 如果您需要不同的过滤逻辑,请实现IExceptionPropertyFilter
  • 使用CompositeExceptionPropertyFilter组合多个过滤器

持续集成

名称 操作系统 状态 历史
Azure Pipelines Ubuntu Azure Pipelines Ubuntu Build Status
Azure Pipelines Mac Azure Pipelines Mac Build Status
Azure Pipelines Windows Azure Pipelines Windows Build Status
Azure Pipelines 总体 Azure Pipelines Overall Build Status Azure DevOps Build History
GitHub Actions Ubuntu、Mac和Windows GitHub Actions Status GitHub Actions Build History
AppVeyor Ubuntu、Mac和Windows AppVeyor Build Status AppVeyor Build History

贡献和感谢

有关更多信息,请查看贡献指南

  • 304NotModified - 添加了Markdown语法高亮。
  • joelweiss - 添加了Entity Framework Core解构器。
  • krajek & JeroenDragt - 添加过滤器以帮助忽略要记录的异常属性。
  • krajek - 帮助处理使用反射解构器时的循环依赖。
  • mraming - 为记录会抛出异常的属性提供帮助。
  • optical - 为巨大的VS 2017升级PR提供帮助。
  • Jérémie Bertrand - 让Serilog.Exceptions与Mono兼容。
  • krajek - 编写一些急需的单位测试。
产品 兼容和附加计算目标框架版本。
.NET net5.0 兼容。 net5.0-windows 已计算。 net6.0 兼容。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。
.NET Core netcoreapp1.0 已计算。 netcoreapp1.1 已计算。 netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET Standard netstandard1.3 兼容。 netstandard1.4 已计算。 netstandard1.5 已计算。 netstandard1.6 已计算。 netstandard2.0 兼容。 netstandard2.1 兼容。
.NET Framework net46 已计算。 net461 兼容。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 兼容。 net48 已计算。 net481 已计算。
MonoAndroid monoandroid 已计算。
MonoMac monomac 已计算。
MonoTouch monotouch 已计算。
Tizen tizen30 已计算。 tizen40 已计算。 tizen60 已计算。
通用Windows平台 uap 已计算。 uap10.0 已计算。
Xamarin.iOS xamarinios 已计算。
Xamarin.Mac xamarinmac 已计算。
Xamarin.TVOS xamarintvos 已计算。
Xamarin.WatchOS xamarinwatchos 已计算。
兼容的目标框架
包含的目标框架(在包中)
更多关于 目标框架.NET Standard 的信息。

NuGet 包 (292)

显示依赖 Serilog.Exceptions 的前 5 个 NuGet 包

下载
Serilog.Exceptions.EntityFrameworkCore

记录异常详情和未在 Exception.ToString() 中输出的自定义属性。包含 Entity Framework Core 异常的自定义解构器。

Sitko.Core.App

Sitko.Core 是一套帮助快速构建 .NET Core 应用的库

Serilog.Exceptions.SqlServer

记录异常详情和未在 Exception.ToString() 中输出的自定义属性。包含 SQL Server 异常的自定义解构器。

Blauhaus.Analytics.Serilog

包描述

Serilog.Exceptions.MsSqlServer

记录异常详情和未在 Exception.ToString() 中输出的自定义属性。包含 SQL Server 异常的自定义解构器。

GitHub 仓库 (39)

显示依赖 Serilog.Exceptions 的前 5 个最受欢迎的 GitHub 仓库

仓库 Stars
fullstackhero/dotnet-starter-kit
一流生产级云就绪 .NET 8 入门套件(Web API + Blazor 客户端),带有多租户支持,以及能节省大约 200+ 开发小时的清洁/模块化架构。所有电池俱全。
BililiveRecorder/BililiveRecorder
录播姬 | mikufans 生放送录制
Dotnet-Boxed/Templates
包含电池组的 .NET 项目模板,提供启动所需的最低代码量,让您更快地开始。
jamie-mh/AuthenticatorPro
📱 Android + Wear OS 的双因素认证(2FA)客户端
rmcrackan/Libation
Libation:解放您的图书馆
版本 下载 最后更新
8.4.0 26,802,347 8/15/2022
8.3.0 2,336,709 6/30/2022
8.2.0 2,863,917 5/20/2022
8.1.0 5,958,107 2/19/2022
8.0.0 5,112,422 11/9/2021
7.1.0 1,765,646 9/28/2021
7.0.0 5,148,525 6/15/2021
6.1.0 7,532,983 3/12/2021
6.0.0 4,067,322 11/18/2020
5.7.0 1,678,298 11/3/2020
5.6.0 4,668,082 7/9/2020
5.5.0 1,530,621 6/2/2020
5.4.0 5,996,633 12/26/2019
5.3.1 4,577,052 7/11/2019
5.3.0 300,552 6/26/2019
5.2.0 89,331 6/22/2019
5.0.0 3,122,061 12/27/2018
4.1.0 2,631,365 5/1/2018
4.0.0 1,050,646 2/11/2018
3.0.0 216,938 11/17/2017
2.5.0 194,555 8/21/2017
2.4.1 514,487 5/13/2017
2.4.0 232,936 2/7/2017
2.3.0 143,953 1/30/2017
2.2.1 213,254 9/18/2016
2.2.0 4,650 9/7/2016
2.0.1 42,966 9/3/2016
2.0.0 26,021 6/28/2016
2.0.0-rc 2,907 6/17/2016
2.0.0-build0009 3,001 9/2/2016
2.0.0-build0008 2,928 8/22/2016
2.0.0-beta0007 2,869 8/22/2016
1.2.0 19,826 5/19/2016
1.1.0 57,279 2/5/2016
1.0.1 4,411 12/7/2015
1.0.0 18,415 12/7/2015