gpt4 book ai didi

c# - 在 C# 中使用 DI 登录到控制台

转载 作者:行者123 更新时间:2023-12-02 10:51:02 24 4
gpt4 key购买 nike

在这个简短的示例中,如果我只保留 .AddConsole()ConfigureServices无论 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(); public void Run() => public async Task Run()并且应该在没有 debug() 选项的情况下工作我找不到任何关于为什么会发生这种情况的信息

有人知道为什么吗?

最佳答案

I am not aware why this is not happening for the addDebug() option.

我认为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
}

Also i came across another solution which is create an asynchronous Task and wait upon it.

像这样更新代码。

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");
//}
}

关于c# - 在 C# 中使用 DI 登录到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59575156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com