add ability to use DI for sinks
JanEggers opened this issue · comments
JanEggers commented
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");
}
Nicholas Blumhardt commented
Hi @JanEggers
Currently, we're aiming to support this via Serilog.Extensions.Hosting; see:
JanEggers commented
thx @nblumhardt for pointing me to the blogposts that means I can remove some of my code.