serilog / serilog-extensions-logging

Serilog provider for Microsoft.Extensions.Logging

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

add ability to use DI for sinks

JanEggers opened this issue · comments

using DI with a Factory instead of creating the provider right away you can use the service container to get stuff i needed to configure serilog:

private static ILoggingBuilder AddSerilog(this ILoggingBuilder builder, bool dispose)
        {
            builder.Services.TryAddSingleton(c => new LoggerConfiguration());

            builder.Services.TryAddSingleton(c => {
                var loggerConfiguration = c.GetRequiredService<LoggerConfiguration>();
                return loggerConfiguration.CreateLogger();
            });

            builder.Services.TryAddSingleton<Serilog.ILogger>(c => c.GetRequiredService<Serilog.Core.Logger>());
            builder.Services.TryAddSingleton(c => new SerilogLoggerProvider(c.GetRequiredService<Serilog.ILogger>(), dispose));


            builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider, SerilogLoggerProvider>());
            return builder;
        }

        public static ILoggingBuilder AddSerilog(this ILoggingBuilder builder, bool dispose, Action<LoggerConfiguration> configure)
        {
            return builder.AddSerilog(dispose, (l, s) => configure(l));
        }

        public static ILoggingBuilder AddSerilog(this ILoggingBuilder builder, bool dispose, Action<LoggerConfiguration, IServiceProvider> configure)
        {
            builder.AddSerilog(dispose);
            builder.Services.AddSingleton(c => {
                var loggerConfiguration = new LoggerConfiguration();
                configure(loggerConfiguration, c);
                return loggerConfiguration;
            });

            return builder;
        }


usage: 

      using (var services = new ServiceCollection()
                .AddLogging(logging => {
                    logging.AddSerilog(true, (serilog, services) => serilog
                        .WriteTo.Database(services.GetRequiredService<LogDbContext>()));
                })
                .BuildServiceProvider())
            {
                var logger = services.Resolve<ILogger<Class>>();
                logger.LogDebug("logging");
            }

Hi @JanEggers 👋

Currently, we're aiming to support this via Serilog.Extensions.Hosting; see:

thx @nblumhardt for pointing me to the blogposts that means I can remove some of my code.