Come ottenere Microsoft.Extensions.Logging<T> nell'applicazione console utilizzando Serilog e AutoFac?

Come ottenere Microsoft.Extensions.Logging<T> nell'applicazione console utilizzando Serilog e AutoFac?

Microsoft.Extensions.Logging (vedi fonte) non fa parte di ASP.NET Core e può essere eseguito indipendentemente da esso. Tutto quello che devi fare è registrare il ILoggerFactory e ILogger<> interfaccia.

Il ILoggerFactory è usato da Logger<T> per creare un'istanza del logger effettivo.

Quando si utilizza l'estensione Logging nelle applicazioni della console, si consiglia comunque di utilizzare il IServiceCollection , poiché ciò ti consente di utilizzare il IServiceCollection metodi di estensione per registrare tutti i pacchetti che supportano questo modello.

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

Questo è l'approccio consigliato, poiché non dovrai pensare in dettaglio quali classi devono essere registrate per le biblioteche che hanno Microsoft.Extensions.DependencyInjection supporto per l'integrazione.

Ma ovviamente puoi anche registrarlo manualmente, ma quando si verifica una modifica al Microsoft.Extensions.Logging libreria (nuova dipendenza aggiunta), non la otterrai e dovrai prima capire o scavare nel codice sorgente per trovare l'errore.

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

Non resta che registrare i tipi di logger dopo la creazione del contenitore o prima dell'avvio dell'applicazione:

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

e nei tuoi servizi inserisci ILogger<MyService> come al solito.


Consiglierei un approccio leggermente diverso se desideri registrare manualmente ir direttamente su Autofac:

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
}

E questo sul tuo codice di avvio principale:

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.