处理 ASP.NET Core 3.1 中未处理的异常

Ron*_*ono 3 exception asp.net-core blazor

在 ASP.NET Core 3.1 中添加了一项功能,可以将未处理的异常传递到 ILogger 实例,如下所述: 登录 .NET Core 和 ASP.NET Core

我有一个服务器端 Blazor 网站,我希望能够在函数中处理这些异常,在该函数中我可以将它们记录到数据库或发送电子邮件。但是,我无法根据提供的文档提出执行此操作的代码。有人可以提供示例代码来捕获未处理的异常吗?

agu*_*ars 5

我建议将Serilog与您需要的接收器一起使用。

在您的项目中添加包:

dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Settings.Configuration
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.Debug
dotnet add package Serilog.Sinks.Seq
Run Code Online (Sandbox Code Playgroud)

Serilog.AspNetCore将 Serilog 与 ASP.Net core 集成。
Serilog.Settings.Configuration从.Net core 配置中读取serilog 配置。
Serilog.Sinks.Console在控制台中写入日志。
Serilog.Sinks.Debug在 Visual Studio 输出窗格中写入日志。
Serilog.Sinks.Seq在Seq服务器中写入日志,这比 DB 强大得多。

在您的Program.cs中设置登录:

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
            .ReadFrom.Configuration(hostingContext.Configuration))
        .Build();
Run Code Online (Sandbox Code Playgroud)

在 Startup.cs 中:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Admin/Error");
    }

    app.UseSerilogRequestLogging()

Run Code Online (Sandbox Code Playgroud)

并在appsettings.json中配置日志:

"Serilog": {
    "LevelSwitches": {
      "$controlSwitch": "Information"
    },
    "MinimumLevel": {
      "ControlledBy": "$controlSwitch"
    },
    "WriteTo": [
      {
        "Name": "Seq",
        "Args": {
          "serverUrl": "http://localhost:5341/",
          "controlLevelSwitch": "$controlSwitch",
          "apiKey": "{SeqApiKey}"
        }
      },
      {
        "Name": "Console"
      },
      {
        "Name": "Debug"
      }
    ],
    "Enrich": [
      "FromLogContext",
      "WithMachineName",
      "WithThreadId"
    ]
  }
Run Code Online (Sandbox Code Playgroud)

这告诉 Serilog 使用 Seq 中为您的应用程序配置的日志级别。

   "LevelSwitches": {
      "$controlSwitch": "Information"
    }
...
        "Args": {
          "serverUrl": "http://localhost:5341/",
          "controlLevelSwitch": "$controlSwitch",
          "apiKey": "{SeqApiKey}"
        }
Run Code Online (Sandbox Code Playgroud)

{SeqApiKey}是在您的应用程序的 Seq 服务器中配置的 Api 密钥。

如果您想使用数据库,Serilog 有一长串可供您使用的接收器。