Sentry with Serilog in NET Core 3.1 worker

Viewed 757

I have a NET Core 3.1 worker configured like this:

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

and this is the appsettings file:

 "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"
        }
      }
    ]
  }

If I try:

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

Console log works properly but it won't log to Sentry.

What I miss?

Update

I added Sentry.Serilog with no luck.

I found a lot of example to add sentry in WebHost context like this:

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

but I don't know how to do that here in my worker service context, is this the problem?

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

This is my 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>();
               });
    }
}
0 Answers
Related