.NET控制台应用如何用Serilog同时输出日志到控制台与文件?
.NET控制台应用用Serilog同时输出到控制台和文件
核心思路
Serilog 原生支持多Sink输出,不需要重定向控制台输出,只需配置同时向控制台和文件写入日志即可。如果原有代码使用Console.WriteLine,建议统一替换为Serilog的日志方法(如Log.Information),既能保留控制台显示,又能自动写入文件;若必须保留Console调用,也可通过简单包装实现同步记录。
步骤1:安装必要NuGet包
打开NuGet包管理器,安装以下包:
Serilog.Sinks.Console:控制台输出SinkSerilog.Sinks.File:文件输出SinkSerilog.Extensions.Hosting(.NET Core/.NET 5+ 必备):整合Host环境
命令行安装:
Install-Package Serilog.Sinks.Console Install-Package Serilog.Sinks.File Install-Package Serilog.Extensions.Hosting
步骤2:基础配置(无Host的控制台应用)
直接在Program.cs中配置Serilog,同时启用控制台和文件输出:
using Serilog; // 配置Serilog var logger = new LoggerConfiguration() .MinimumLevel.Information() // 设置最低日志级别(可按需调整) .WriteTo.Console() // 输出到控制台 .WriteTo.File( path: "logs/app-.txt", // 日志文件路径,自动按日期分割 rollingInterval: RollingInterval.Day, // 每天生成新日志文件 retainedFileCountLimit: 7, // 保留最近7天的日志 outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" // 自定义日志格式 ) .CreateLogger(); // 设置全局日志实例 Log.Logger = logger; try { Log.Information("应用启动"); // 示例:用户交互逻辑 Console.WriteLine("请输入指令:"); var userInput = Console.ReadLine(); Log.Information("用户输入:{UserInput}", userInput); Console.WriteLine("处理完成,按任意键退出"); Log.Information("应用正常结束"); Console.ReadKey(); } catch (Exception ex) { Log.Fatal(ex, "应用意外终止"); } finally { Log.CloseAndFlush(); // 确保所有日志写入文件 }
步骤3:Host环境下的配置(.NET Core/.NET 5+)
如果使用Generic Host搭建控制台应用,可通过UseSerilog整合配置:
using Microsoft.Extensions.Hosting; using Serilog; var host = Host.CreateDefaultBuilder(args) .UseSerilog((context, config) => { config .ReadFrom.Configuration(context.Configuration) // 支持从appsettings.json读取配置 .WriteTo.Console() .WriteTo.File("logs/app-.txt", rollingInterval: RollingInterval.Day); }) .Build(); await host.RunAsync();
保留原有Console.WriteLine的方案
如果不想修改原有大量Console调用,可重定向Console.Out到Serilog:
// 在Serilog配置完成后添加 Console.SetOut(new SerilogWriter(Log.Logger)); // 自定义Writer类 public class SerilogWriter : TextWriter { private readonly ILogger _logger; public SerilogWriter(ILogger logger) { _logger = logger; } public override Encoding Encoding => Encoding.UTF8; public override void WriteLine(string? value) { if (!string.IsNullOrEmpty(value)) _logger.Information(value); base.WriteLine(value); } }
这样所有Console.WriteLine的内容会同时输出到控制台和日志文件。
内容的提问来源于stack exchange,提问作者Dominique BOYER
相关产品推荐
相关产品推荐

