Search code examples
c#.net-coreserilog

Correctly Injecting Serilog into .net core classes as Microsoft.Extentions.Logging.ILogger - Not ASP .Net Core


So I have a .Net Core Console application and a bunch of .Net core Libraries.

Most of the classes in the libraries have constructors like this.

public class ReportingManager
{
   private ILogger _logger;
   Public ReportingManager(ILogger logger)
   {
      _logger = logger;
   }
}

with ILogger being of type Microsoft.Extentions.Logging.ILogger

In my Console app I have this.

class Program
{
    static void Main(string[] args)
    {           
            var serilog = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Warning)
                .Enrich.FromLogContext()
                .WriteTo.Console(theme: AnsiConsoleTheme.Code)
                .CreateLogger();

            ReportingManager manager = new ReportingManager(serilog);

    }
}

I have an intellisense error at 'ReportingManager manager = new ReportingManager(serilog);'

cannot convert from 'Serilog.Core.Logger' to 'Microsoft.Extensions.Logging.ILogger'

So my question is, how do I pass in Serilog correctly?

Had a look online and here but most talk about ASP.Net Core.


Solution

  • You need to wrap the Serilog logger into Microsoft.Extensions.Logging.LoggerFactory. This is exactly what happens when same is used in DI in ASP.NET.

    Like this :

    Serilog.Core.Logger serilog = ...;
    
    var loggerFactory = new LoggerFactory()
        .AddSerilog(serilog);
    
    Microsoft.Extensions.Logging.ILogger logger = loggerFactory.CreateLogger("Logger");
    

    This needs Serilog.Extensions.Logging NuGet package.