簡體   English   中英

在 C# 中使用 DI 登錄到控制台

[英]Logging to Console with DI in C#

在這個簡短的示例中,如果我在ConfigureServices只保留.AddConsole() ,則無論 LogLevel 如何都不會記錄到控制台,但是如果我添加.AddConsole().AddDebug()所有消息都會記錄到控制台 3 次! 我錯過了什么? 謝謝!

namespace samples
{
    using System;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Logging;

    public class Program
    {    
        public static void Main(string[] args)
        {
            var serviceCollection = new ServiceCollection();
            ConfigureServices(serviceCollection);
            var serviceProvider = serviceCollection.BuildServiceProvider();

            var app = serviceProvider.GetService<Application>();
            app.Run();
        }

        private static void ConfigureServices(IServiceCollection services)
        {
            // Add Logger
            services.AddLogging(configure => configure.AddConsole().AddDebug());

            // Register Application
            services.AddTransient<Application>();
        }
    }

    public class Application {
        private readonly ILogger logger;

        public Application(ILogger<Application> logger)
        {
            this.logger = logger;
            this.logger.LogInformation("In Application::ctor");
        }

        public void Run() 
        {
            this.logger.LogInformation("Info: In Application::Run");
            this.logger.LogWarning("Warn: In Application::Run");
            this.logger.LogError("Error: In Application::Run");
            this.logger.LogCritical("Critical: In Application::Run");
        }
    }
}

這是每個 Log*() 調用顯示的內容:

fail: samples.Application[0]
      Error: In Application::Run
samples.Application: Error: Error: In Application::Run

更新/解決方案感謝@panoskarajohn解決這個問題。 App.Run() 需要是異步的:更改app.Run(); => Task.Run(() => app.Run()).Wait(); app.Run(); => Task.Run(() => app.Run()).Wait(); public void Run() => public async Task Run()並且應該在沒有debugging()選項的情況下工作我找不到任何關於為什么會發生這種情況的信息

有誰知道為什么?

我不知道為什么addDebug()選項沒有發生這種情況。

我想AddDebug()有一些特殊的配置,並在程序退出之前刷新輸出。 如果您有任何線索,請賜教

為什么 addConsole() 不起作用?

控制台日志記錄發生在后台線程上。 因此,如果應用程序退出太快,那么記錄器沒有時間記錄 -> https://github.com/aspnet/Logging/issues/631

所以並不是說它沒有發生。 就是它沒有時間寫到控制台。 應用程序退出太快。

為了在您的代碼中修復此問題。 在程序末尾添加Console.Read()使其不會退出。

public static void Main(string[] args)
        {
            var serviceCollection = new ServiceCollection();
            ConfigureServices(serviceCollection);
            var serviceProvider = serviceCollection.BuildServiceProvider();

            var app = serviceProvider.GetService<Application>();
            app.Run();
            Console.Read(); // So the application will not exit and there will be time for the background thread to do its job
        }

我還遇到了另一個解決方案,它創建一個異步Task並等待它。

像這樣更新代碼。

public static void Main(string[] args)
        {
            var serviceCollection = new ServiceCollection();
            ConfigureServices(serviceCollection);
            var serviceProvider = serviceCollection.BuildServiceProvider();

            var app = serviceProvider.GetService<Application>();
            Task.Run(() => app.Run()).Wait();
        }
// also update your Application run method
public async Task Run()
        {
            logger.LogInformation("Info: In Application::Run");
            logger.LogWarning("Warn: In Application::Run");
            logger.LogError("Error: In Application::Run");
            logger.LogCritical("Critical: In Application::Run");
        }

最終結果應該是這樣的。

public class Program
    {
        public static void Main(string[] args)
        {
            var serviceCollection = new ServiceCollection();
            ConfigureServices(serviceCollection);
            var serviceProvider = serviceCollection.BuildServiceProvider();

            var app = serviceProvider.GetService<Application>();
            Task.Run(() => app.Run()).Wait();
            Console.Read();
        }

        private static void ConfigureServices(IServiceCollection services)
        {
            // Add Logger
            services.AddLogging(configure =>
            {
                configure.AddConsole();
            }).AddTransient<Application>();
        }
    }

    public class Application
    {
        private readonly ILogger<Application> logger;

        public Application(ILogger<Application> logger)
        {
            this.logger = logger;
            this.logger.LogInformation("In Application::ctor");
        }

        public async Task Run()
        {
            logger.LogInformation("Info: In Application::Run");
            logger.LogWarning("Warn: In Application::Run");
            logger.LogError("Error: In Application::Run");
            logger.LogCritical("Critical: In Application::Run");
        }

        //public void Run()
        //{
        //    logger.LogInformation("Info: In Application::Run");
        //    logger.LogWarning("Warn: In Application::Run");
        //    logger.LogError("Error: In Application::Run");
        //    logger.LogCritical("Critical: In Application::Run");
        //}
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM