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

.NET Core 3.1如何配置日志同时输出到控制台与文件?

.NET Core 3.1 同时输出日志到控制台和文件的解决方案

一、使用内置日志框架实现双输出

内置日志框架原生支持多输出目标,你之前的问题大概率是配置时仅注册了单个日志提供者。按以下步骤配置即可:

  1. 安装文件日志依赖包
    内置文件日志需要额外安装NuGet包:

    Install-Package Microsoft.Extensions.Logging.File
    
  2. 在Program.cs中配置双输出
    修改CreateHostBuilder方法,同时添加控制台和文件日志提供者:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
            {
                // 清除默认提供者(可选,避免重复输出)
                logging.ClearProviders();
                // 注册控制台日志
                logging.AddConsole();
                // 注册文件日志,指定路径、单文件大小上限和保留文件数量
                logging.AddFile(@"logs\app-{Date}.txt", fileSizeLimitBytes: 10485760, retainedFileCountLimit: 10);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
    
  3. 验证输出
    在业务代码中注入ILogger<T>记录日志,比如在Controller中:

    private readonly ILogger<HomeController> _logger;
    
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }
    
    public IActionResult Index()
    {
        _logger.LogInformation("测试日志:同时输出到控制台和文件");
        return View();
    }
    

    运行程序后,控制台会实时打印日志,同时项目根目录下的logs文件夹会生成对应日期的日志文件,包含相同的日志内容。

二、使用Serilog实现双输出

Serilog的多Sink配置逻辑很直接,只需同时注册控制台和文件Sink即可,以下是正确配置方式:

  1. 安装Serilog相关依赖包
    安装核心包及控制台、文件扩展:

    Install-Package Serilog.AspNetCore
    Install-Package Serilog.Sinks.Console
    Install-Package Serilog.Sinks.File
    
  2. 在Program.cs中初始化Serilog
    在程序入口处配置Serilog并替换内置日志系统:

    public static int Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Information() // 设置全局最低日志级别
            .WriteTo.Console() // 添加控制台输出Sink
            .WriteTo.File(@"logs\serilog-app-{Date}.txt",
                rollingInterval: RollingInterval.Day, // 按天滚动生成文件
                fileSizeLimitBytes: 10485760, // 单文件最大10MB
                retainedFileCountLimit: 10) // 保留最近10个日志文件
            .CreateLogger();
    
        try
        {
            Log.Information("程序启动");
            CreateHostBuilder(args).Build().Run();
            return 0;
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "程序启动失败");
            return 1;
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }
    
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseSerilog() // 替换内置日志系统为Serilog
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
    
  3. 验证效果
    同样通过ILogger<T>记录日志,运行后控制台会实时输出,logs目录下也会生成Serilog格式的日志文件,两者日志内容完全一致。

常见问题排查

  • 检查日志级别:确保控制台和文件的日志级别设置一致,比如不要控制台设为Information、文件设为Error,导致部分日志仅输出到单一目标。
  • 检查文件权限:确认程序对指定的日志目录有写入权限,否则文件日志无法生成。
  • 避免重复配置:使用Serilog时,通过UseSerilog()替换内置日志系统即可,不要同时保留内置控制台日志,避免重复打印。

内容的提问来源于stack exchange,提问作者Mohiden Adam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:35:15