Serilog 简介:它是什么以及为什么需要它
Serilog 是一个强大、灵活且现代的库,用于 .NET 生态系统(C#、F#、VB.NET)中的结构化日志记录。与传统的日志记录框架(例如 NLog 或 log4net)不同,后者处理的是纯文本消息,Serilog 从设计之初就旨在处理结构化数据。
为什么需要 Serilog?
- 结构化日志记录:您记录的不仅仅是一个字符串,而是带有命名属性的对象。这使得在 Elasticsearch、Seq、Datadog 等系统中可以高效地过滤、搜索和分析日志。
- 灵活性(Sinks):Serilog 使用“接收器”(sinks)的概念。您可以将日志发送到控制台、文件、数据库、云服务(Azure、AWS)、Elasticsearch、Telegram、Slack 以及数百个其他位置——只需连接相应的包即可。
- 性能:Serilog 针对高负载应用程序进行了优化。它使用延迟字符串格式化(消息模板),以避免在日志记录级别未激活时产生不必要的内存分配。
- 配置简单:通过代码或 JSON 文件进行配置。开始使用只需几行代码。
- 诊断:允许轻松地将上下文信息(例如用户 ID、订单号、方法名称)添加到每条日志中。
安装 Serilog
Serilog 通过 NuGet(.NET 的包管理器)分发。可以通过包管理器控制台或 .NET CLI 进行安装。
通过 .NET CLI 安装(推荐):
dotnet add package Serilogdotnet add package Serilog.Sinks.Consoledotnet add package Serilog.Sinks.Filedotnet add package Serilog.Settings.Configurationdotnet add package Serilog.AspNetCore通过包管理器控制台安装(Visual Studio):
Install-Package SerilogInstall-Package Serilog.Sinks.ConsoleInstall-Package Serilog.Sinks.FileInstall-Package Serilog.Settings.ConfigurationInstall-Package Serilog.AspNetCore包说明:
- Serilog — 库的核心。
- Serilog.Sinks.Console — 用于输出到控制台的接收器。
- Serilog.Sinks.File — 用于写入文件的接收器。
- Serilog.Settings.Configuration — 允许从
appsettings.json读取设置。 - Serilog.AspNetCore — 与 ASP.NET Core 集成(将 HTTP 上下文添加到日志中)。
给 PythonLib 读者的说明: 在 Python 中,通过 pip 安装的类似命令是 pip install serilog(但 Serilog 是一个 .NET 库,Python 有自己的工具,例如 structlog)。
快速入门:30 秒内记录第一条日志
创建一个 .NET 控制台应用程序,并将以下代码添加到 Program.cs 中:
using Serilog;
// 1. 配置 SerilogLog.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console() .WriteTo.File("logs/myapp.log", rollingInterval: RollingInterval.Day) .CreateLogger();
try{ Log.Information("应用程序已成功启动。");
int userId = 42; string userName = "Alice"; Log.Information("用户 {UserId}(用户名 {UserName})已登录。", userId, userName);
// 错误示例 try { throw new InvalidOperationException("无效操作"); } catch (Exception ex) { Log.Error(ex, "为用户 {UserId} 执行操作时发生错误", userId); }
Log.Warning("这是一个警告。级别:{Leve