web-dev-qa-db-de.com

Verwendung von LoggerFactory und Microsoft.Extensions.Logging für die .NET Core Console-Protokollierung mit C #

Ich habe eine Konsolenanwendung erstellt, die eine Serviceschicht verwendet.

Program.cs

public static void Main(string[] args)
{
    // Create service collection
    var serviceCollection = new ServiceCollection();
    ConfigureServices(serviceCollection);

    // Create service provider
    var serviceProvider = serviceCollection.BuildServiceProvider();

    // Entry to run app
    serviceProvider.GetService<App>().Run().RunSynchronously();
}

private static void ConfigureServices(IServiceCollection serviceCollection)
{
    // Configuration
    var configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", false)
        .Build();

    serviceCollection.AddOptions();
    serviceCollection.Configure<Settings>(options =>
    {
        //...
    });

    // Services
    serviceCollection.AddTransient<IOneService, OneService>();
    serviceCollection.AddTransient<ISecondService, SecondService>();

    // Repositories
    serviceCollection.AddTransient<MyContext, MyContext>();
    serviceCollection.AddTransient<IOneRepository, OneRepository>();

    // App
    serviceCollection.AddTransient<App>();

    // Logger

    // Automapper
    serviceCollection.AddSingleton(new AutoMapperProfileConfiguration());
    serviceCollection.AddScoped<IMapper>(sp =>
        new Mapper(sp.GetRequiredService<IConfigurationProvider>(), sp.GetService));
}

Ich erhalte diesen Fehler System.InvalidOperationException: Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger1` und schätze, dass ich LoggerFactory und Microsoft.Extensions.Logging für .NET Core Logging einrichten muss, aber ich kann es nicht richtig machen.

Ich habe so etwas in Main () versucht:

// Attempt 1
ILoggerFactory loggerFactory = new LoggerFactory()
    .AddConsole()
    .AddDebug();
ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation(
  "This is a test of the emergency broadcast system.");

// Attempt 2
serviceCollection.AddSingleton(new LoggerFactory()
    .AddConsole()
    .AddDebug());

Irgendwelche Ideen?

9
Gerald Hughes

Es sollte funktionieren:

var serviceProvider = new ServiceCollection()
                      .AddLogging() //<-- You were missing this
                      .BuildServiceProvider();
//get logger
var logger = serviceProvider.GetService<ILoggerFactory>()
            .CreateLogger<Program>();

Zu installierende Pakete: Microsoft.Extensions.DependencyInjection; Microsoft.Extensions.Logging;

8
OlegI

Wenn Sie möchten, dass Log4Net die .Net-Konsolen-App wie folgt unterstützt:

loggerFactory.AddLog4Net()

sie müssten ILoggerProvider implementieren. Ich habe einen Artikel und einen Code dazu geschrieben: http://www.michalbialecki.com/2018/12/21/adding-a-log4net-provider-in-net-core-console-app/

0
Mik