C# (.NET) 日志记录:最佳解决方案概述
日志记录是任何严肃 C# 应用程序开发中至关重要的方面。它允许您跟踪系统状态、诊断错误、分析用户行为并收集性能指标。在 .NET 生态系统中,有多个成熟的日志记录库,每个都有其优势。在本文中,我们将介绍三种最流行的解决方案:Serilog、NLog 和 log4net,以及标准抽象层 Microsoft.Extensions.Logging。
为什么需要单独的日志记录库?
内置的 System.Diagnostics.Debug 类或 Console.WriteLine 仅适用于最简单的场景。专业库提供:
- 日志级别(Trace、Debug、Information、Warning、Error、Fatal)——灵活的消息过滤。
- 结构化日志记录——以 JSON 格式保存数据,便于后续分析。
- 多种“接收器”(sinks/targets)——写入文件、数据库、控制台、ELK 栈、Sentry、Application Insights 等。
- 动态配置——无需重启应用程序即可更改日志级别。
- 性能——异步写入、缓冲,对运行速度影响最小。
1. Serilog——现代标准
Serilog 是 .NET 中最流行的库,专注于结构化日志记录。它不使用 string.Format 格式化字符串,而是使用命名占位符:
using Serilog;
Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console() .WriteTo.File("logs/app-.log", rollingInterval: RollingInterval.Day) .WriteTo.ApplicationInsights(TelemetryConfiguration.Active, TelemetryConverter.Traces) .CreateLogger();
// 结构化日志记录示例Log.Information("用户 {UserId} 完成了订单 {OrderId},金额 {Total:C}", userId, orderId, total);Serilog 非常适合微服务、云应用程序以及需要通过 Kibana 或 Grafana 进行深度日志分析的项目。
2. NLog——灵活性与性能
NLog 是一个功能强大的库,具有丰富的路由能力。它支持 XML 配置和编程设置。NLog 的特点是内置异步写入机制和支持条件规则。
using NLog;
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public void ProcessOrder(Order order){ Logger.Info("开始处理订单 {OrderId}", order.Id); try { // 业务逻辑 Logger.Debug("订单 {OrderId} 已成功处理", order.Id); } catch (Exception ex) { Logger.Error(ex, "处理订单 {OrderId} 时出错", order.Id); throw; }}由于从 log4net 迁移简单,NLog 常被选用于桌面应用程序(WPF、WinForms)和遗留项目。
3. log4net——久经考验的老将
log4net 是流行的 Java 库 log4j 的移植版本。这是最“年长”的解决方案,仍在企业项目中广泛使用。其主要优势是数十年来积累的大量适配器和“附加器”(appenders)。
// 通过 XML 配置 (log4net.config)<log4net> <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> <file value="logs/app.log" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd" />