.NET Core 3.1控制台应用中ILogger无法输出到控制台的原因
控制台未打印日志的原因及解决方案
我来帮你排查这个问题——我之前在.NET Core 3.1控制台项目里也碰到过一模一样的情况,核心原因其实是控制台日志的异步写入机制和程序退出时机冲突了。
为什么没输出?
在.NET Core 3.1中,Microsoft.Extensions.Logging.Console的日志是异步写入的。你的代码里,Main方法执行完logger.LogInformation后就直接结束了,程序进程随之终止,这时候控制台日志提供者还没来得及把日志内容写入控制台,所以你看不到任何输出。
两种解决办法
方法1:让程序暂停,等待日志输出
这是最快速的临时解决方案,在Main方法末尾添加一行代码,让程序暂停下来,给日志足够的时间写入控制台:
using Microsoft.Extensions.Logging; class Program { static void Main(string[] args) { var loggerFactory = LoggerFactory.Create(builder => { builder .AddFilter("Microsoft", LogLevel.Information) .AddFilter("System", LogLevel.Information) .AddFilter("TestRx.Program", LogLevel.Information) .AddConsole(); }); ILogger logger = loggerFactory.CreateLogger<Program>(); logger.LogInformation("Example log message"); // 添加这行,让程序暂停,等待日志输出 Console.ReadKey(); } }
方法2:使用主机(IHost)管理应用生命周期(更推荐)
对于实际项目来说,使用.NET Core的主机机制是更规范的做法,它会自动处理日志的刷新、服务的生命周期管理等问题,不需要手动暂停程序:
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace TestRx { class Program { static void Main(string[] args) { // 创建主机 var host = Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging .AddFilter("Microsoft", LogLevel.Information) .AddFilter("System", LogLevel.Information) .AddFilter("TestRx.Program", LogLevel.Information) .AddConsole(); }) .Build(); // 从服务容器获取日志实例 var logger = host.Services.GetRequiredService<ILogger<Program>>(); logger.LogInformation("Example log message"); // 运行主机(这里会处理生命周期,确保日志完成写入) host.Run(); } } }
额外提示
如果你不想使用host.Run()(它会让程序一直运行),也可以用host.Start()然后手动停止,但记得要等待日志刷新:
await host.StartAsync(); var logger = host.Services.GetRequiredService<ILogger<Program>>(); logger.LogInformation("Example log message"); await host.StopAsync();
不过这种情况下需要把Main方法改成异步的:static async Task Main(string[] args)
内容的提问来源于stack exchange,提问作者Troskyvs
相关产品推荐
相关产品推荐

