如何使用ConsoleLoggerProvider创建一个LoggerFactory?

93

ConsoleLoggerProvider 有四个构造函数:

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

其中三个已被声明为过时,附带以下消息:

此方法已过时,并将在将来的版本中移除。建议使用 LoggerFactory 配置筛选和 ConsoleLoggerOptions 配置日志记录选项。

对于第3个构造函数,使用包含 ConsoleLoggerProviderLoggerFactory 是很简单的(根据 Entity Framework Core - Logging 文档):

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

但是由于它已被弃用,我们只能使用构造函数 #2。以下是我发现的等效方法:

但是由于它已被废弃,我们只剩下构造函数#2。以下是我发现的等价内容:

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 });

这似乎过于复杂,我是否错过了更简单的东西?


4
随着.NET5的推出,情况变得更糟了,而不是更好。 - boatcoder
4个回答

147
Microsoft.Extensions.Logging 3.0+ 版本中,你可以使用更简单的 LoggerFactory.Create 方法:
var loggerFactory = LoggerFactory.Create(builder =>
{
    builder.AddFilter("Microsoft", LogLevel.Warning)
           .AddFilter("System", LogLevel.Warning)
           .AddFilter("SampleApp.Program", LogLevel.Debug)
           .AddConsole();
});

对于 Microsoft.Extensions.Logging 版本 2.2+,你可以通过 Microsoft 的依赖注入框架构建一个不使用过时方法的 ILoggerFactory。相比于 2.1 版本,这种方式更加简洁,不需要手动构建所有内容。以下是具体步骤:
var serviceCollection = new ServiceCollection();
serviceCollection.AddLogging(builder => builder
    .AddConsole()
    .AddFilter(level => level >= LogLevel.Information)
);
var loggerFactory = serviceCollection.BuildServiceProvider()
    .GetService<ILoggerFactory>();

另请参阅: 请注意添加 NuGet 包:
dotnet add package Microsoft.Extensions.Logging.Console

19
这对于应用程序组合非常棒,但是当我编写测试或使用REPL时怎么办?能够以更直接的方式满足ILogger依赖项将是很好的。 LoggerFactory几乎足够简短,但可发现性不理想... - Lukáš Lánský
8
FYI,第一个示例中使用AddConsole()需要引用Microsoft.Extensions.Logging.Console。 - blackboxlogic
60
当一个简单的任务需要依赖注入、大量选项、提供者和工厂时,@microsoft 的某些事情完全出了问题。 - python_kaa
python_kaa显然不理解DI - undefined
更有可能的是,微软需要重新审视框架设计的最佳实践。 - undefined

11

以防万一,如果有人想在ASP.NET Core的组合根中使用efcore进行操作:

services.AddDbContext<DbContext>(opt => {
    opt.AddSqlServer(Configuration.GetConnectionString("DefaultConnection"));
    opt.UseLoggerFactory(LoggerFactory.Create(builder => { builder.AddConsole(); }));
});

0

@0xced 感谢您提供的分解示例,由于委托在 Powershell 中不起作用,这帮助我在 Powershell 中完成了相同的操作:

$optionsFactory = [OptionsFactory[ConsoleLoggerOptions]]::new(
    [List[ConfigureNamedOptions[ConsoleLoggerOptions]]]@(
        [ConfigureNamedOptions[ConsoleLoggerOptions]]::new('',$null)
    ),
    [List[IPostConfigureOptions[ConsoleLoggerOptions]]]::new()
)

$optionsMonitor = [OptionsMonitor[ConsoleLoggerOptions]]::new(
    $optionsFactory,
    [List[IOptionsChangeTokenSource[ConsoleLoggerOptions]]]::new(),
    [OptionsCache[ConsoleLoggerOptions]]::new()
)

$consoleLoggerProvider = [ConsoleLoggerProvider]$OptionsMonitor
$consoleLoggerProviderList = [List[ILoggerProvider]]::new()
$consoleLoggerProviderList.add($consoleLoggerProvider)

$loggerFactory = [LoggerFactory]::new(
    $consoleLoggerProviderList,
    [LoggerFilterOptions]@{
        MinLevel = [LogLevel]::Information
    }
)

这对我有用。谢谢! - zendu

-1
@Justin-Grote的答案对我有用。这是代码的C#版本。
            var loggerFactory = new LoggerFactory();
        var optionsFactory = new OptionsFactory<ConsoleLoggerOptions>(
            new List<ConfigureNamedOptions<ConsoleLoggerOptions>>()
            {
                new ConfigureNamedOptions<ConsoleLoggerOptions>("", null)
            },
            new List<IPostConfigureOptions<ConsoleLoggerOptions>>()
        );

        var optionsMonitor = new OptionsMonitor<ConsoleLoggerOptions>(
            optionsFactory,
            new List<IOptionsChangeTokenSource<ConsoleLoggerOptions>>(),
            new OptionsCache<ConsoleLoggerOptions>()
        );
        var consoleLoggerProvider = new ConsoleLoggerProvider(optionsMonitor);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接