.NET Core 3.1如何配置日志同时输出到控制台与文件?
.NET Core 3.1 同时输出日志到控制台和文件的解决方案
一、使用内置日志框架实现双输出
内置日志框架原生支持多输出目标,你之前的问题大概率是配置时仅注册了单个日志提供者。按以下步骤配置即可:
安装文件日志依赖包
内置文件日志需要额外安装NuGet包:Install-Package Microsoft.Extensions.Logging.File在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>(); });验证输出
在业务代码中注入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即可,以下是正确配置方式:
安装Serilog相关依赖包
安装核心包及控制台、文件扩展:Install-Package Serilog.AspNetCore Install-Package Serilog.Sinks.Console Install-Package Serilog.Sinks.File在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>(); });验证效果
同样通过ILogger<T>记录日志,运行后控制台会实时输出,logs目录下也会生成Serilog格式的日志文件,两者日志内容完全一致。
常见问题排查
- 检查日志级别:确保控制台和文件的日志级别设置一致,比如不要控制台设为
Information、文件设为Error,导致部分日志仅输出到单一目标。 - 检查文件权限:确认程序对指定的日志目录有写入权限,否则文件日志无法生成。
- 避免重复配置:使用Serilog时,通过
UseSerilog()替换内置日志系统即可,不要同时保留内置控制台日志,避免重复打印。
内容的提问来源于stack exchange,提问作者Mohiden Adam
相关产品推荐
相关产品推荐

