Вход в консольное приложение ядра.Net не работает

Я следую этому руководству: https://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/

и соответственно установил пакеты, но журнал нигде не печатается.

Это мой код:

  var serviceProvider = new ServiceCollection()
            .AddLogging()
            .AddTransient<IFoo, Foo>(s =>
            {
                return new Foo()})
            .BuildServiceProvider();

            //configure console logging
            serviceProvider
                .GetService<ILoggerFactory>()
                .AddConsole(LogLevel.Debug);

 var logger = serviceProvider.GetService<ILoggerFactory>().CreateLogger<Program>();

            logger.LogError("Starting application");

4 ответа

Решение

Оказывается, провайдер логирования консоли не сразу сбрасывает сообщения на консоль, как это было в версиях net-core-1.x. Кажется, он работает в другом потоке. См. Эту веб-страницу для информации: https://github.com/aspnet/Logging/issues/631

Вы можете добавить в конце основной функции.

serviceProvider.Dispose();

или вы можете добавить .AddDebug()

            serviceProvider
            .GetService<ILoggerFactory>()
            .AddConsole(LogLevel.Debug)
            .AddDebug();

Создание нового ServiceProvider и HostBuilder может не стоить того, если мы просто хотим использовать консольное приложение для входа в систему, потому что очистить или утилизировать его нужно с осторожностью. Скорее, я бы предложил просто иметь Logging Factory для использования регистратора, и это решит проблему ведения журнала, если это только то, что мы хотим.

public static class ApplicationLogging
{
    public static ILoggerFactory LogFactory { get; } = LoggerFactory.Create(builder =>
        builder.ClearProviders(); 
        // Clear Microsoft's default providers (like eventlogs and others)
        builder.AddSimpleConsole(options =>
        {
            options.IncludeScopes = true;
            options.SingleLine = true;
            options.TimestampFormat = "hh:mm:ss ";
        });
        builder.AddApplicationInsights("instrument-key");
    });
    public static ILogger<T> CreateLogger<T>() => LogFactory.CreateLogger<T>();
}

static void Main(string[] args)
{
    var logger = ApplicationLogging.CreateLogger<Program>();
    logger.LogInformation("Let's do some work");
    logger.LogWarning("I am going Crazy now!!!");
    logger.LogInformation("Seems like we are finished our work!");
    Console.ReadLine();
}

Я попал в эту ветку, пытаясь выяснить, почему не работало ведение журнала на консоли, и этот ответ документирует найденное. Используемые пакеты: Microsoft.Extensions.Logging Microsoft.Extensions.Logging.Console Microsoft.Extensions.Logging.Debug

Приложение: консоль.NET Core 2.2 (Microsoft.NET.Sdk, netcoreapp2.2). Используя Microsoft.Extensions.Hosting.IHost, вот как я добавил консольное ведение журнала:

var hostBuilder = new HostBuilder()
                // Other Configuration omitted for brevity
                .ConfigureLogging((hostBuilderContext, loggingBuilder) =>
                {
                    loggingBuilder.AddConfiguration(hostBuilderContext.Configuration.GetSection("Logging"));
                    loggingBuilder.AddConsole(options =>
                    {
                        options.IncludeScopes = true;
                    });
                    loggingBuilder.AddDebug();
                });
// Start the application
await hostBuilder.RunConsoleAsync();

Интересно, что если я удаляю параметр options в вызове AddConsole, я не вижу никакой регистрации. Я считаю, что это так, потому что я использую ILogger в своем коде, который испускает операторы журнала:

public class ClassThatLogs
{
    private readonly ILogger<ClassThatLogs> _logger;

    public ClassThatLogs(ILogger<ClassThatLogs> logger)
    {
        _logger = logger;
    }

    public void DoWork()
    {
        _logger.LogInformation("Working");
    }
}

Если я опубликую консольное приложение как:

один файл _log.LogDebug не дает вывода

когда я публикую его не как отдельный файл (поэтому я только снимаю флажок с одного файла), _log.LogDebug выводит на консоль все мои операторы отладки. Никаких других изменений, кроме снятия отметки с одного файла.

Таким образом, только сняв флажок «создать один файл», мой _logging.LogDebug начинает записывать данные в консоль.

Кажется, это: https://github.com/serilog/serilog-settings-configuration/issues/244

Другие вопросы по тегам