Search code examples
c#.net-coreasp.net-core-2.2

How to create a LoggerFactory with a ConsoleLoggerProvider?


The ConsoleLoggerProvider has four constructors:

  1. ConsoleLoggerProvider(IConsoleLoggerSettings)
  2. ConsoleLoggerProvider(IOptionsMonitor<ConsoleLoggerOptions>)
  3. ConsoleLoggerProvider(Func<String,LogLevel,Boolean>, Boolean)
  4. ConsoleLoggerProvider(Func<String,LogLevel,Boolean>, Boolean, Boolean)

Three of them are declared obsolete with this message:

This method is obsolete and will be removed in a future version. The recommended alternative is using LoggerFactory to configure filtering and ConsoleLoggerOptions to configure logging options.

With constructor #3, creating a LoggerFactory with a ConsoleLoggerProvider is straightforward (as documented on Entity Framework Core - Logging):

var loggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider((category, level) => level >= LogLevel.Information, true) });

But since it's deprecated, we are left with constructor #2. Here's what I found to be equivalent:

var configureNamedOptions = new ConfigureNamedOptions<ConsoleLoggerOptions>("", null);
var optionsFactory = new OptionsFactory<ConsoleLoggerOptions>(new []{ configureNamedOptions }, Enumerable.Empty<IPostConfigureOptions<ConsoleLoggerOptions>>());
var optionsMonitor = new OptionsMonitor<ConsoleLoggerOptions>(optionsFactory, Enumerable.Empty<IOptionsChangeTokenSource<ConsoleLoggerOptions>>(), new OptionsCache<ConsoleLoggerOptions>());
var loggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider(optionsMonitor) }, new LoggerFilterOptions { MinLevel = LogLevel.Information });

This seems overly complicated, am I missing something simpler?


Solution

  • In Microsoft.Extensions.Logging 3.0+, you can use the much simpler LoggerFactory.Create:

    var loggerFactory = LoggerFactory.Create(builder =>
    {
        builder.AddFilter("Microsoft", LogLevel.Warning)
               .AddFilter("System", LogLevel.Warning)
               .AddFilter("SampleApp.Program", LogLevel.Debug)
               .AddConsole();
    });
    

    For Microsoft.Extensions.Logging version 2.2+, you can build an ILoggerFactory without using obsolete methods via Microsoft's dependency injection framework. It's a little less verbose than the 2.1 version where everything is constructed by hand. Here’s how:

    var serviceCollection = new ServiceCollection();
    serviceCollection.AddLogging(builder => builder
        .AddConsole()
        .AddFilter(level => level >= LogLevel.Information)
    );
    var loggerFactory = serviceCollection.BuildServiceProvider()
        .GetService<ILoggerFactory>();
    

    See also:

    Pay attention to adding the nuget package:

    dotnet add package Microsoft.Extensions.Logging.Console