【问题标题】:Using Serilog and Sentry during ASP.NET Core startup在 ASP.NET Core 启动期间使用 Serilog 和 Sentry
【发布时间】:2019-09-15 21:28:15
【问题描述】:

我正在尝试将应用启动期间引发的错误记录到哨兵。我正在使用带有 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 类中的 ConfigureServicesConfigure 方法登录:

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 配置中也可以解决问题,尽管这似乎与 sentry 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);
                }))

【问题讨论】:

    标签: c# asp.net-core serilog sentry


    【解决方案1】:

    ASP.NET Core 日志记录基础架构在应用程序请求管道之前构建。因此,我们只能通过 Logging 集成来捕获应用启动期间发生的异常。

    使用Sentry.AspNetCore时会捕获应用程序初始化错误的原因是这个包依赖于Sentry.Extensions.Logging

    当您执行UseSentry 时,它会在内部与框架日志记录基础设施挂钩。 Startup 类中的崩溃发生在实际构建应用程序之前(启动应用程序需要完成 ConfigureServicesConfigure),因此只有使用 Logging 集成,我们才能在那时捕获错误。

    Serilog 添加到应用后,the default logging backend gets replace by it。这意味着由Sentry.Extensions.Logging 完成的日志基础设施挂钩在Serilog 接管后不再生效。

    因此,您还需要添加包Sentry.Serilog。 在这种情况下,添加了两个包后,只有通过 Serilog 集成初始化 SDK(正如您上次评论所做的那样),您才能捕获引导错误。示例中没有这样做以避免混淆(为什么我需要提供我的 DSN 两次?)但是幕后发生的情况是,由 Serilog 完成的第一次初始化只有在 Startup 进程完成之前才真正有用。一旦Sentry.AspNetCore 被初始化,它将关闭由Serilog 集成创建的第一个客户端并刷新所有事件并将新客户端添加到主范围。这样可以确保将请求数据等内容也添加到事件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多