首页 > 解决方案 > NET Core 3.1 worker 中带有 Serilog 的哨兵

问题描述

我有一个这样配置的 NET Core 3.1 worker:

public static IHostBuilder CreateHostBuilder(string[] args) =>
       Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
           {
               
               var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

               var configuration = new ConfigurationBuilder()
               .SetBasePath(GetBasePath())
               .AddJsonFile("appsettings.json", false)
               .AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true)
               .Build();

               services.AddSingleton<ILogger>(s =>
               {
                   return new LoggerConfiguration()
                   .ReadFrom.Configuration(configuration)
                   .CreateLogger();
               });

这是 appsettings 文件:

 "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.Sentry" ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning",
        "Sentry": "Warning"
      }
    },
    "Enrich": [ "FromLogContext", "WithExceptionDetails" ],
    "WriteTo": [
      {
        "Name": "Console"
      },
      {
        "Name": "Sentry",
        "Args": {
          "Dsn": "https://<<my-key>>",
          "MinimumBreadcrumbLevel": "Information",
          "MinimumEventLevel": "Information",
          "AttachStackTrace": true,
          "Debug": true,
          "Environment": "Develop",
          "DiagnosticsLevel": "Information"
        }
      }
    ]
  }

如果我尝试:

_logger.Information("Test INFO");
throw new Exception("foo");

Console日志工作正常,但它不会登录到Sentry.

我想念什么?

更新

Sentry.Serilog没有运气添加。

我发现了很多在 WebHost 上下文中添加哨兵的示例,如下所示:

.ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder
                        .UseKestrel()
                        .UseConfiguration(Configuration)
                        .UseSerilog()
                        .UseSentry(o =>

但我不知道如何在我的工作人员服务上下文中执行此操作,这是问题所在吗?

 public static IHostBuilder CreateHostBuilder(string[] args) =>
           Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
               {
                   ???

这是我的Program.cs

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;
using System;
using System.IO;
using System.Text;
using System.Threading;

namespace PdfQueueWorker
{
    class Program
    {
        private static readonly string _environment
         = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production";

        public static IConfiguration Configuration { get; private set; } = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
                   .AddJsonFile("appsettings.json", false)
                   .AddJsonFile($"appsettings.{_environment}.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();


        static void Main(string[] args)
        {

            if (_environment != "Stable")
            {
                Serilog.Debugging.SelfLog.Enable(Console.Error);
            }

            Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(Configuration)
                .CreateLogger();

            try
            {
                Log.Information("Starting.");

                CreateHostBuilder(args).Build().Run();
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "Host terminated unexpectedly");
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
           Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
               {

                   services.AddSingleton<ILogger>(s =>
                   {
                       return new LoggerConfiguration()
                       .ReadFrom.Configuration(Configuration)
                       .CreateLogger();
                   });

                   services.AddSingleton(Configuration);

                   services.AddHostedService<Worker>();
               });
    }
}

标签: c#serilogsentry

解决方案


推荐阅读