如何使用 ConsoleLoggerProvider 创建 LoggerFactory?

问题描述 投票:0回答:4

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,使用

LoggerFactory

 创建 
ConsoleLoggerProvider
 非常简单(如 
Entity Framework Core - 日志记录 中所述):

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

这似乎过于复杂,我是否缺少一些更简单的东西?

c# .net-core asp.net-core-2.2
4个回答
142
投票

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 版本稍微简洁一些,在 2.1 版本中,所有内容都是“手动”构建的。方法如下:
var serviceCollection = new ServiceCollection(); serviceCollection.AddLogging(builder => builder .AddConsole() .AddFilter(level => level >= LogLevel.Information) ); var loggerFactory = serviceCollection.BuildServiceProvider() .GetService<ILoggerFactory>();

另请参阅:

从 Microsoft.Extensions.Logging 2.1 迁移到 2.2 或 3.0以防万一,如果有人想在 efcore 的 ASP.NET Core 组合根中执行此操作:

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

@0xced 感谢您解构的示例,因为代表不能在 Powershell 中工作,这帮助我在 Powershell 中做同样的事情:

0
投票
$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 } )

@Justin-Grote 的回答对我有用。这是代码的 C# 版本。

0
投票
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);


© www.soinside.com 2019 - 2024. All rights reserved.