在 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");

    }

}

我想这与每个记录器的初始化顺序有关,但我对启动过程的了解不足以提出解决方案或至少是解释。知道为什么会发生这种情况,我该如何解决?


守着一只汪
浏览 123回答 1
1回答

MMMHUHU

ASP.NET Core 日志基础结构是在应用程序请求管道之前构建的。出于这个原因,我们只能通过日志集成捕获应用程序启动期间发生的异常。仅&nbsp;使用时捕获应用程序初始化错误的原因Sentry.AspNetCore是此包依赖于Sentry.Extensions.Logging.当您这样做时UseSentry,它会在内部挂钩到框架日志基础结构中。类中的崩溃Startup发生在应用程序实际构建之前(完成ConfigureServices并Configure需要启动应用程序),因此只有使用日志记录集成,我们才能在此时捕获错误。添加Serilog到您的应用程序后,默认的日志记录后端将被替换。这意味着现在已经接管了对日志记录基础设施的挂钩Sentry.Extensions.Logging不再生效。Serilog因此,您也需要添加包Sentry.Serilog。Serilog在这种情况下,添加两个包后,只有当您通过集成初始化 SDK(就像您根据上一条评论所做的那样)时,您才能捕获引导错误。为了避免混淆(为什么我需要两次提供我的 DSN?),示例中没有这样做,但在幕后发生的事情是,由 Serilog 完成的第一次初始化只有在该Startup过程完成之前才真正有用。初始化Sentry.AspNetCore后,它将关闭Serilog集成创建的第一个客户端并刷新所有事件并将新客户端添加到主范围。这确保请求数据之类的东西也被添加到事件中。
打开App,查看更多内容
随时随地看视频慕课网APP