[英]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()
有一些特殊的配置,並在程序退出之前刷新輸出。 如果您有任何線索,請賜教。
控制台日志記錄發生在后台線程上。 因此,如果應用程序退出太快,那么記錄器沒有時間記錄 -> 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.