Serilog 是 .NET 中非常流行的结构化日志库,它能将日志记录为带有属性的结构化数据(如 JSON),便于后续搜索、分析和集中管理。与传统文本日志不同,结构化日志保留了上下文信息,适合集成到 ELK、Seq、Application Insights 等系统。
安装 Serilog 包
在项目中使用 Serilog,先通过 NuGet 安装核心包和所需的接收器(Sink):
Serilog:核心库 Serilog.Sinks.Console:输出到控制台 Serilog.Sinks.File:输出到文件 Serilog.Sinks.Seq(可选):发送到 Seq 服务可通过 Package Manager 或 CLI 安装:
dotnet add package Serilog dotnet add package Serilog.Sinks.Console dotnet add package Serilog.Sinks.File配置全局日志记录器
在程序启动时配置 Log.Logger,通常在 Program.cs 或 Main 方法中完成:
using Serilog; Log.Logger = new LoggerConfiguration() .WriteTo.Console() .WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day) .CreateLogger(); // 使用后记得刷新并关闭 try { // 启动应用逻辑 } finally { Log.CloseAndFlush(); }这样所有日志会同时输出到控制台和按天滚动的日志文件中。
在代码中使用结构化日志
通过 Log.Information、Log.Warning、Log.Error 等方法写入日志。Serilog 会自动提取占位符中的属性值:
var userId = 123; var action = "Login"; Log.Information("用户 {UserId} 执行了 {Action}", userId, action);输出可能是:
{"Timestamp":"2025-04-05T10:00:00Z","Level":"Information","MessageTemplate":"用户 {UserId} 执行了 {Action}","Properties":{"UserId":123,"Action":"Login"}}注意:{UserId} 和 {Action} 成为结构化字段,可在日志平台中直接查询 UserId=123。
集成到 ASP.NET Core
在 ASP.NET Core 项目中,替换默认日志提供者:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseSerilog((context, services, configuration) => configuration .WriteTo.Console() .WriteTo.File("logs/app-.txt", rollingInterval: RollingInterval.Day) .Enrich.FromLogContext() // 添加上下文信息,如请求 ID .ReadFrom.Services(services)) // 读取配置 .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup之后可以在控制器或服务中注入 ILogger
基本上就这些。Serilog 的强大在于结构化输出和丰富的 Sink 支持,搭配 Seq 或 Elasticsearch 能极大提升排查效率。关键是用好命名占位符,避免拼接字符串日志。不复杂但容易忽略。
