【问题标题】:How to create a LoggerFactory with a ConsoleLoggerProvider?如何使用 ConsoleLoggerProvider 创建 LoggerFactory?
【发布时间】:2019-05-10 11:26:30
【问题描述】:

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。这是我发现的等效内容:

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

这似乎太复杂了,我错过了一些更简单的东西吗?

【问题讨论】:

  • .NET5 变得更糟,而不是更好.....

标签: .net-core asp.net-core-2.2


【解决方案1】:

在 .NET Core 2.2 中,您可以通过 Microsoft 的依赖注入框架构建ILoggerFactory,而无需使用过时的方法。它比所有内容都手工构建的版本稍微简洁一些。方法如下:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

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

而在 .NET Core 3.0 中,您可以使用LoggerFactory.Create

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

另见:

【讨论】:

  • 这对于应用程序组合非常有用,但是当我编写测试或使用 REPL 时呢?如果能够以更直接的方式实现ILogger 依赖关系,那就太好了。 LoggerFactory 差不多够短了,但是可发现性并不理想……
  • FYI 第一个示例 .AddConsole() 需要引用 Microsoft.Extensions.Logging.Console
  • 出了点问题@microsoft,对于这样一个简单的任务,我们需要依赖注入和一大堆选项、提供程序和工厂
【解决方案2】:

以防万一,如果有人想在 ASP.NET Core 组合根中为 efcore 执行此操作:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-06-19
      • 2019-02-04
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多