ConsoleLoggerProvider有四个构造函数:
ConsoleLoggerProvider(IConsoleLoggerSettings)
ConsoleLoggerProvider(IOptionsMonitor<ConsoleLoggerOptions>)
ConsoleLoggerProvider(Func<String,LogLevel,Boolean>, Boolean)
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 });
这似乎过于复杂,我是否缺少一些更简单的东西?
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 组合根中执行此操作:services.AddDbContext<DbContext>(opt => {
opt.AddSqlServer(Configuration.GetConnectionString("DefaultConnection"));
opt.UseLoggerFactory(LoggerFactory.Create(builder => { builder.AddConsole(); }));
});
@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
}
)
@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);