John-Luke Laue
John-Luke Laue

Reputation: 3856

Custom Logger Provider being excluded by Serilog

Serilog works great, but I noticed it seems to exclude any custom logger providers I setup.

When I have UseSerilog() in my Startup, my CustomProvider never gets created (CreateLogger never gets called).

Is it possible to still use custom providers with Serilog?

//class Program, Main Method
WebHost.CreateDefaultBuilder(args)
    .UseConfiguration(config)
    .UseSerilog() //after adding this, my Custom Logger never gets called 
    .UseStartup<Startup>()
    .Build();


//class Startup
public void Configure(IApplicationBuilder app, ILoggerFactory logger, IServiceProvider serviceProvider)
{
    logger.AddProvider(new CustomProvider(serviceProvider));
}

public class CustomProvider : ILoggerProvider
{
    private readonly IServiceProvider _serviceProvider;

    public void Dispose()
    {
    }

    public CustomProvider(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    //--------------never gets called---------------
    public ILogger CreateLogger(string categoryName)
    {
        var logger = _serviceProvider.GetService<CustomLogger>();
        logger.LogLevel = LogLevel.Error;

        return logger;
    }
}

Upvotes: 3

Views: 2830

Answers (1)

Nicholas Blumhardt
Nicholas Blumhardt

Reputation: 31887

You'll need to plug your custom provider into Serilog (as a sink) instead. Serilog replaces the entire default logging pipeline for greater efficiency and so that there aren't two sets of level controls and filters to keep in sync.

This post has the background: https://nblumhardt.com/2017/08/use-serilog/.

Upvotes: 4

Related Questions