Serilog と AutoFac を使用してコンソール アプリケーションで Microsoft.Extensions.Logging<T> を取得する方法は?

Microsoft.Extensions.Logging (ソースを参照) は ASP.NET Core の一部ではなく、独立して実行できます。 ILoggerFactory を登録するだけです。 と ILogger<>

ILoggerFactory Logger<T> で使用されています 実際のロガーをインスタンス化します。

コンソール アプリケーションで Logging 拡張機能を使用する場合は、引き続き IServiceCollection を使用することをお勧めします 、これにより IServiceCollection を使用できるようになります このパターンをサポートするすべてのパッケージを登録するための拡張メソッド

var services = new ServiceCollection();
services.AddLogging();

// Initialize Autofac
var builder = new ContainerBuilder();
// Use the Populate method to register services which were registered
// to IServiceCollection
builder.Populate(services);

// Build the final container
IContainer container = builder.Build();

Microsoft.Extensions.DependencyInjection を持つライブラリにどのクラスを登録する必要があるかを詳細に考える必要がないため、これは推奨されるアプローチです。 統合サポート

もちろん、手動で登録することもできますが、変更が Microsoft.Extensions.Logging に発生した場合 ライブラリ (新しい依存関係が追加された) を取得できないため、まずソース コードを把握するか掘り下げてエラーを見つける必要があります。

builder.RegisterType<LoggerFactory>()
    .As<ILoggerFactory>()
    .SingleInstance();
builder.RegisterGeneric(typeof(Logger<>))
    .As(typeof(ILogger<>))
    .SingleInstance();

あとは、コンテナーのビルド後またはアプリケーションの開始前にロガー タイプを登録するだけです。

var loggerFactory = container.Resolve<ILoggerFactory>();
loggerFactory.AddConsole()
    .AddSerilog();

サービスに ILogger<MyService> を挿入します いつものように。


Autofac で ir を手動で直接登録する場合は、少し異なる方法をお勧めします:

private static void ConfigureLogging(ILoggingBuilder log)
{
    log.ClearProviders();
    log.SetMinimumLevel(LogLevel.Error);
    log.AddConsole();
}

private static void ConfigureContainer(ContainerBuilder builder)
{
    builder.Register(handler => LoggerFactory.Create(ConfigureLogging))
        .As<ILoggerFactory>()
        .SingleInstance()
        .AutoActivate();

    builder.RegisterGeneric(typeof(Logger<>))
        .As(typeof(ILogger<>))
        .SingleInstance();
    // other registrations
}

そして、これはメインの起動コードです:

var containerBuilder = new ContainerBuilder();
ConfigureContainer(containerBuilder);

var container = containerBuilder.Build();
var serviceProvider = new AutofacServiceProvider(container);
// you can use either the built container or set the serviceProvider onto the library you are using.