Closed JanEggers closed 3 years ago
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.
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: