You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:42:38