如何创建一个日志工厂与 ConsolLoggerProvider?

控制台日志提供商有四个构造函数:

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

其中三个已被宣布过时,并附有以下信息:

此方法已过时,将在以后的版本中删除。推荐的替代方法是使用 LoggerFactory 配置筛选,使用 Console LoggerOptions 配置日志记录选项。

使用构造函数 # 3,创建带有 ConsoleLoggerProviderLoggerFactory非常简单(正如在 实体框架核心日志记录上记录的那样) :

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

这看起来太复杂了,我是不是错过了一些更简单的东西?

45682 次浏览

微软,扩展,日志3.0 + 中,你可以使用更简单的 LoggerFactory 创建:

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

对于 MEL 2.2 + 版本,你可以通过微软的依赖注入框架构建一个不需要使用过时方法的 ILoggerFactory。与构造 用手的2.1版本相比,它略微不那么冗长。方法如下:

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

参见:

由于代表们不在 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
}
)

以防万一,如果有人想在 ASP.NET Core 中使用 efcore 的复合 root:

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