c# - 在 ASP.NET Core 启动期间使用 Serilog 和 Sentry
问题描述
我正在尝试将应用程序启动期间引发的错误记录到哨兵。我正在使用带有 Serilog 和 Sentry 的 ASP.NET Core 2.1.2。如果我只使用哨兵,它似乎工作正常。
WebHost.CreateDefaultBuilder(args)
.UseSentry("dsn")
.UseStartup<Startup>()
.Build()
.Run();
但是,如果我添加 Serilog,应用程序在启动期间不会发送任何事件,尽管如果控制器操作引发异常,它会继续工作。
WebHost.CreateDefaultBuilder(args)
.UseSerilog(
(hostingContext, loggerConfiguration) =>
loggerConfiguration
.Enrich.FromLogContext()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.Sentry(s => {
s.MinimumBreadcrumbLevel = LogEventLevel.Debug;
s.MinimumEventLevel = LogEventLevel.Error;
}))
.UseSentry("dsn")
.UseStartup<Startup>()
.Build()
.Run();
我正在尝试从Startup 类中的ConfigureServices
和方法登录:Configure
public class Startup
{
public Startup(IConfiguration configuration, ILogger<Startup> logger)
{
Configuration = configuration;
Logger = logger;
}
public IConfiguration Configuration { get; }
public ILogger<Startup> Logger { get; }
public void ConfigureServices(IServiceCollection services)
{
Logger.LogError(new Exception("something went wrong while configuring services"), "ERROR");
services
.AddMvc()
.AddJsonOptions(options =>
{
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
Logger.LogError(new Exception("something went wrong while configuring app"), "ERROR");
}
}
我想这与每个记录器的初始化顺序有关,但我对启动过程的理解不足以提出解决方案或至少是一个解释。知道为什么会发生这种情况,我该如何解决?
更新
似乎明确地将 DNS 添加到 serilog 配置也解决了这个问题,尽管这似乎与哨兵 repo 中的样本相悖。
.UseSerilog(
(hostingContext, loggerConfiguration) =>
loggerConfiguration
.Enrich.FromLogContext()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.Sentry(s => {
s.MinimumBreadcrumbLevel = LogEventLevel.Debug;
s.MinimumEventLevel = LogEventLevel.Error;
s.Dsn = new Dsn(dsn);
}))
解决方案
ASP.NET Core 日志记录基础结构在应用程序请求管道之前构建。因此,我们只能通过 Logging 集成来捕获应用程序启动期间发生的异常。
仅 使用时捕获应用程序初始化错误的原因Sentry.AspNetCore
是此包依赖于Sentry.Extensions.Logging
.
当您这样做时UseSentry
,它会在内部挂钩到框架日志记录基础设施。类中的崩溃Startup
发生在应用程序实际构建之前(完成ConfigureServices
并Configure
需要启动应用程序),因此只有使用 Logging 集成,我们才能在那时捕获错误。
添加Serilog
到应用程序后,默认的日志记录后端将被它替换。这意味着现在已经接管了对日志基础设施的钩子Sentry.Extensions.Logging
不再生效。Serilog
出于这个原因,您也需要添加包Sentry.Serilog
。Serilog
在这种情况下,添加两个包后,只有通过集成初始化 SDK(正如您上次评论所做的那样),您才能捕获引导错误。示例中没有这样做以避免混淆(为什么我需要提供我的 DSN 两次?)但是在幕后发生的是,由 Serilog 完成的第一次初始化只有在Startup
过程完成之前才真正有用。初始化Sentry.AspNetCore
后,它将关闭Serilog
集成创建的第一个客户端并刷新所有事件并将新客户端添加到主范围。这样可以确保将请求数据等内容也添加到事件中。
推荐阅读
- http - 使用STM32在多个ESP8266到一个ESP8266之间建立通信(HTTP协议)
- c++ - 关于最大有符号整数值的非常简单的问题
- flutter - 如何远程运行 Flutter 驱动程序测试
- javascript - 关于 WebAuthn(FIDO)
- spring-boot - jms连接失败后Springboot应用无法恢复
- ebpf - eBPF 验证器中的 func_info 是什么?
- sql-server - PowerBI Report Builder 与 AWS Redshift 的集成
- c++ - 索引 2^21 处的执行时间开销
- kubernetes - 如何通过api或其他交互连接kubernetes pods(终端)?
- php - php 在嵌套数组中使用 array_slice