推荐使用Serilog:结构化日志记录的首选库
项目介绍
Serilog 是一个专为 .NET 应用程序设计的诊断日志记录库。它易于设置,拥有简洁的API,并且支持所有现代 .NET 平台。无论是简单应用还是复杂的分布式和异步系统,Serilog 都能提供强大的日志功能。
与其他.NET日志库一样,Serilog 可以将日志输出到文件、控制台以及各种其他目标。然而,它的核心优势在于其对结构化事件数据的内置支持。
项目技术分析
Serilog 的独特之处在于它使用了消息模板(Message Templates)——这是一种扩展.NET格式字符串,支持命名参数而非仅限于位置参数的语言特性。与传统日志记录器相比,它不仅记录事件信息,还能捕获每个命名参数所关联的值。
例如:
var position = new { Latitude = 25, Longitude = 134 };
var elapsedMs = 34;
log.Information("Processed {@Position} in {Elapsed} ms", position, elapsedMs);
这使得 Serilog 能够记录两个属性,Position
和 Elapsed
,并在日志事件中保存这些结构化数据。
项目及技术应用场景
Serilog 支持将日志数据输出成多种格式,包括 JSON,便于进行搜索和分析,无需解析或使用正则表达式。例如,上述日志事件在 JSON 格式下可表示为:
{"Position": {"Latitude": 25, "Longitude": 134}, "Elapsed": 34}
同时,Serilog 在文本输出时仍保持易读性,使得在日常监控和调试中非常方便:
09:14:22 [INF] Processed {"Latitude": 25, "Longitude": 134} in 34 ms.
Serilog 特别适用于需要处理大量复杂日志数据,或者希望实现高效日志分析的项目。如微服务架构、Web 应用、物联网设备、大数据处理系统等。
项目特点
- 社区支持并持续更新。
- 熟悉的基于级别的API,如 Debug、Information、Warning、Error 等。
- 可以通过 C# 或 XML/JSON 进行配置。
- 当未启用的日志级别时,具有极低的运行开销。
- 优秀的 .NET Core 兼容性,支持 ASP.NET Core 集成。
- 提供广泛的接收端(Sinks),涵盖文件、控制台、云服务器等多种场景。
- 具有丰富上下文信息的事件增强功能,如 LogContext 属性、线程/进程 ID 等。
- 无共享状态的 Logger 对象,支持全局静态 Log 类。
- 非格式依赖的流水线,可输出纯文本、JSON、内存中的 LogEvent 对象等。
开始使用 Serilog
Serilog 通过 NuGet 安装。为了查看日志,还需要安装至少一种接收端,这里我们选择控制台和文件接收端:
dotnet add package Serilog
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.File
最简单的配置方式是通过静态的 Log
类,通常在 Program.cs 中初始化:
using Serilog;
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("log.txt",
rollingInterval: RollingInterval.Day,
rollOnFileSizeLimit: true)
.CreateLogger();
更多信息和示例代码,可以在 Serilog 文档 中找到。
让我们一起探索 Serilog 的强大功能,提升您的日志记录体验吧!如果您有任何问题,请访问 Stack Overflow,或者在 GitHub Issue Tracker 上提交详细的问题报告。我们期待您的参与和贡献!