如何使用ConsoleLoggerProvider创建LoggerFactory?

0xc*_*ced 28 .net-core asp.net-core-2.2

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使用a 创建一个ConsoleLoggerProvider很简单(如实体框架核心中记录的 - 日志记录):

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

但由于它已被弃用,我们留下了构造函数#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 });
Run Code Online (Sandbox Code Playgroud)

这看起来过于复杂,我错过了一些简单的东西吗?

0xc*_*ced 40

在.NET Core 2.2中,您可以ILoggerFactory通过Microsoft的依赖注入框架构建一个不使用过时方法的方法.与手工构建一切的版本相比,它的冗长程度要低一些.这是如何做:

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>();
Run Code Online (Sandbox Code Playgroud)

在.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();
    }
);
Run Code Online (Sandbox Code Playgroud)

  • @microsoft,事情完全出错了,对于这样一个简单的任务,我们需要依赖注入和一大堆选项、提供程序和工厂 (41认同)
  • 这对于应用程序组合非常有用,但是当我编写测试或使用REPL时又如何呢?能够以更直接的方式实现`ILogger`依赖关系将是一个很好的选择。LoggerFactory几乎足够短,但是可发现性并不理想... (8认同)
  • 仅供参考第一个示例 .AddConsole() 需要引用 Microsoft.Extensions.Logging.Console (7认同)
  • 这绝对是疯狂的事 (5认同)
  • 仅供参考,使用 .AddConsole() 还需要导入 nuget 包 Microsoft.Extensions.Logging.Console。 (3认同)

Dan*_*l B 11

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

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