簡體   English   中英

在 ASP.NET Core 啟動期間使用 Serilog 和 Sentry

[英]Using Serilog and Sentry during ASP.NET Core startup

我正在嘗試將應用程序啟動期間拋出的錯誤記錄到哨兵。 我正在使用 ASP.NET Core 2.1.2,以及 Serilog 和 Sentry。 如果我只使用哨兵,它似乎工作正常。

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 配置也解決了這個問題,盡管這似乎與哨兵存儲庫中的樣本背道而馳。

.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類中的崩潰發生在實際構建應用程序之前(需要完成ConfigureServicesConfigure才能啟動應用程序),因此僅使用 Logging 集成我們就能夠捕獲此時的錯誤。

Serilog添加到您的應用程序后,默認日志記錄后端將被 it 替換 這意味着Sentry.Extensions.Logging完成的對日志記錄基礎結構的掛鈎不再生效,因為Serilog已經接管了。

因此,您還需要添加Sentry.Serilog包。 在這種情況下,添加兩個包后,只有通過Serilog集成初始化 SDK 時,您才能捕獲引導錯誤(正如您根據上次評論所做的那樣)。 在示例中沒有這樣做以避免混淆(為什么我需要兩次提供我的 DSN?)但在幕后發生的是,由 Serilog 完成的第一次初始化只有在Startup過程完成后才真正有用。 一旦Sentry.AspNetCore被初始化,它將關閉由Serilog集成創建的第一個客戶端並刷新所有事件並向主范圍添加一個新客戶端。 這確保諸如請求數據之類的內容也被添加到事件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM