Netcore не входит в консоль

У меня есть простой тестовый проект, чтобы поэкспериментировать с регистрацией в NetCore 2.0 с помощью пакета Microsoft Logging Extensions.

Проблема в том, что когда я запускаю свое приложение в первый раз, оно записывает информационные сообщения, как и ожидалось. Странное поведение, которое я испытываю, заключается в том, что при последующих запусках сообщения вообще не выдаются.

Мой проект нацелен на инфраструктуру Net Core 2.0, и на нем установлены следующие пакеты NuGet:

  • Microsoft.Extensions.Logging
  • Microsoft.Extensions.Logging.Abstractions
  • Microsoft.Extensions.Logging.Console
  • Microsoft.Extensions.Logging.Debug

Ниже приведен мой пример кода, с которым я пытаюсь настроить ведение журнала:

using System;

namespace LoggingNetCore2
{
    using Microsoft.Extensions.Logging;

    class Program
    {
        static void Main(string[] args)
        {
            var loggerFactory = new LoggerFactory();
            loggerFactory.AddConsole();
            loggerFactory.AddDebug(); // <-- why is this needed for console logging?

            var logger = loggerFactory.CreateLogger(typeof(Program));
            logger.LogInformation("Hello, World!");
            logger.LogTrace("trace");
            logger.LogDebug("debug");
            logger.LogWarning("warning");
            logger.LogCritical("critical");
            logger.LogError("errrrr");

            //using (logger.BeginScope("MyMessages"))
            //{
            //    logger.LogInformation("Beginning Operation...");
            //    logger.LogInformation("Doing something cool... please wait.");
            //    logger.LogInformation("Completed successfully.");
            //}
        }
    }
}

Я не получаю вывод в окне консоли, когда я запускаю выше. Есть идеи, которые приходят на ум, о том, что может происходить?

Вещи, которые я пробовал:

  • Добавлен пакет Microsoft.Extensions.Logging.Abstractions, поскольку я смутно помню, что в прошлом это нужно было делать в приложениях NetCore 1.0.
  • Деинсталлировал / переустановил вышеуказанные пакеты.
  • Я даже пытался запустить приложение из командной строки с помощью команды dotnet.exe, но безрезультатно.
  • Если я вернусь к платформе NetCore 1.1 (и к пакетам NuGet до версии 1.1), все будет работать как положено.

Редактировать: я получил журналы, показывающие теперь в окне консоли, если я добавляю поставщика журнала отладки в смесь.

В приложении NetCore 1.x достаточно было просто добавить поставщика консоли.

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

1 ответ

Решение

@ajawad987, ты прав. Dispose() работает.

public class Program
{
    public static void Main(string[] args)
    {
        var services = new ServiceCollection()
            .AddLogging(config => config.AddConsole())
            .BuildServiceProvider();

        services.GetRequiredService<ILogger<Program>>()
            .LogCritical("Hello");

        ((IDisposable) services)?.Dispose();
    }
}
Другие вопросы по тегам