Search code examples
blazor-server-sideserilog.net-5

Hooking into SignalR event in Blazor ServerSide


I have found this piece of code for the default logging mechanism provided by Microsoft:

public static IHostBuilder CreateHostBuilder(string[] args) =>
          Host.CreateDefaultBuilder(args)
             .ConfigureLogging(logging =>
             {
                 logging.ClearProviders();
                 logging.AddConsole();
                 logging.AddFilter(
                   "Microsoft.AspNetCore.SignalR", LogLevel.Trace);
                 logging.AddFilter(
                   "Microsoft.AspNetCore.Http.Connections",
                   LogLevel.Trace);
             })
             .ConfigureWebHostDefaults(webBuilder =>
             {
                 webBuilder.UseStartup<Startup>();
             });

My set for Serilog is as follows:

public class Program
{
    public static void Main(string[] args)
    {
        try
        {
            using IHost host = CreateHostBuilder(args).Build();
            host.Run();
        }
        catch (Exception ex)
        {                
            if (Log.Logger == null || Log.Logger.GetType().Name == "SilentLogger")
            {
                Log.Logger = new LoggerConfiguration()
                    .MinimumLevel.Debug()
                    .WriteTo.Console()
                    .CreateLogger();
            }

            Log.Fatal(ex, "Host terminated unexpectedly");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    private static IHostBuilder CreateHostBuilder(string[] args)
       => Host.CreateDefaultBuilder(args)
              .UseServiceProviderFactory(new AutofacServiceProviderFactory(Register))
              .ConfigureWebHostDefaults(webBuilder =>
              {
                webBuilder.UseStartup<Startup>()
                   .CaptureStartupErrors(true)
                   .ConfigureAppConfiguration(config => { config.AddJsonFile("appsettings.Local.json", optional: true); })
                   .UseSerilog((hostingContext, loggerConfiguration) =>
                   {
                       loggerConfiguration
                           .ReadFrom.Configuration(hostingContext.Configuration)
                           .Enrich.FromLogContext()
                           .Enrich.WithProperty("ApplicationName", typeof(Program).Assembly.GetName().Name)
                           .Enrich.WithProperty("Environment", hostingContext.HostingEnvironment);

                        #if DEBUG                           
                       loggerConfiguration.Enrich.WithProperty("DebuggerAttached", Debugger.IsAttached);
                        #endif 
                   });
              });

    private static void Register(ContainerBuilder builder) => builder.RegisterLogger(autowireProperties: true);

}

How do I add SignalR filters to my setup?


Solution

  • In Serilog terminology you need to override the minimum level for the Microsoft SignalR namespaces.

    public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
    .UseSerilog((context, config) =>
       {
         /*
         * the rest of the Serilog configuration here
         */
         config.MinimumLevel.Override("Microsoft.AspNetCore.SignalR", LogEventLevel.Debug);
         config.MinimumLevel.Override("Microsoft.AspNetCore.Http.Connections", LogEventLevel.Debug);
       })
    .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });