Функция ведения журнала приложения консоли .Net Core — почему моя консоль.Линия записи отображается вне начального и конечного ведения журнала?

#c# #.net-core

#c# #.net-core

Вопрос:

Нашел эту статью о ведении журнала в .Net Core в консольном приложении.

Кажется, это работает, но я не знаю, почему моя консоль.Строка записи («Выполнение материала»); отображается вне сообщений о начале и завершении ведения журнала.

 using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var services = new ServiceCollection();
            ConfigureServices(services);
            using (ServiceProvider serviceProvider = services.BuildServiceProvider())
            {
                MyApplication app = serviceProvider.GetService<MyApplication>();
                // Start up logic here
                app.Run();
            }
        }
        private static void ConfigureServices(ServiceCollection services)
        {
            services.AddLogging(configure => configure.AddConsole())
            .AddTransient<MyApplication>();
        }
    }

    public class MyApplication
    {
        private readonly ILogger _logger;
        public MyApplication(ILogger<MyApplication> logger)
        {
            _logger = logger;
        }
        internal void Run()
        {
            _logger.LogInformation("Application Started at {dateTime}", DateTime.UtcNow);

            //Business Logic START

            Console.WriteLine("Doing stuff");
            //Business logic END
            _logger.LogInformation("Application Ended at {dateTime}", DateTime.UtcNow);
        }
    }
}
  

введите описание изображения здесь

Комментарии:

1. Что такое ILogger ? Console.WriteLine появляется первым, прежде чем ваш регистратор что-либо делает.

Ответ №1:

Потому что класс ConsoleLogger в Microsoft.Extensions.Logging.Console ставит сообщение в очередь.

В конечном итоге он обрабатывается и распечатывается на консоль в фоновом потоке внутренним процессором регистратора.

Console.WriteLine записывает непосредственно на консоль.