Использование Serilog и Sentry при запуске ASP.NET Core - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь регистрировать ошибки, возникающие при запуске приложения, для часового. Я использую 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();

Я пытаюсь войти в оба метода 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 явно объясняет проблему, хотя, похоже, это не соответствует образцам в часовом репо.

.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);
                }))

1 Ответ

1 голос
/ 02 мая 2019

Инфраструктура ведения журнала ASP.NET Core создается перед конвейером запросов приложений.По этой причине мы можем фиксировать исключения, возникающие во время запуска приложения, только через интеграцию ведения журнала.

Причина, по которой ошибки инициализации приложения регистрируются при использовании только Sentry.AspNetCore состоит в том, что этот пакет зависит от Sentry.Extensions.Logging.

Когда вы делаете UseSentry, он внутренне подключается к инфраструктуре ведения журналов каркасов.Сбои в классе Startup происходят до того, как приложение на самом деле собрано (для загрузки приложения требуется завершение ConfigureServices и Configure), поэтому только с помощью интеграции ведения журнала мы можем зафиксировать ошибки в этот момент.

Как только вы добавите Serilog в свое приложение, бэкэнд ведения журнала по умолчанию будет заменен .Это означает, что подключения к инфраструктуре журналирования, выполняемые Sentry.Extensions.Logging, больше не вступают в силу после того, как Serilog вступило во владение.

По этой причине вам также необходимо добавить пакет Sentry.Serilog.В этом случае, с добавлением обоих пакетов, вы сможете регистрировать ошибки начальной загрузки только в том случае, если вы инициализируете SDK с помощью интеграции Serilog (как вы делали в своем последнем комментарии).Это не сделано в примерах, чтобы избежать путаницы (зачем мне нужно предоставлять свой DSN дважды?), Но что происходит под капотом, так это то, что первая инициализация, выполняемая Serilog, действительно полезна только до завершения процесса Startup.После инициализации Sentry.AspNetCore он закроет первый клиент, созданный интеграцией Serilog, сбросит все события и добавит нового клиента в основную область.Это гарантирует, что такие вещи, как данные запроса, также будут добавлены к событию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...