C# (.NET) 中的日志记录:最佳解决方案概览
日志记录不仅仅是记录错误。它是监控应用程序状态、审计用户操作和在生产环境中调试的基本工具。在 C# (.NET) 生态系统中,有多个成熟的库,每个库都以自己的方式解决日志记录问题。在本文中,我们将分析最流行的解决方案:NLog、Serilog、log4net 和内置的 Microsoft.Extensions.Logging。
1. Microsoft.Extensions.Logging(内置 ILogger)
从 .NET Core 开始,Microsoft 提供了日志记录的抽象——接口 ILogger<T> 和工厂 ILoggerFactory。这不是一个完整的库,而是一个契约,可以连接任何实现(NLog、Serilog 等)。
优点:内置于 ASP.NET Core,基本日志记录无需额外依赖,易于替换为其他库。
缺点:开箱即用的功能有限(仅支持级别:Trace、Debug、Information、Warning、Error、Critical)。没有结构化数据。
使用示例:
using Microsoft.Extensions.Logging;
public class OrderService{ private readonly ILogger<OrderService> _logger;
public OrderService(ILogger<OrderService> logger) { _logger = logger; }
public void ProcessOrder(int orderId) { _logger.LogInformation("处理订单 {OrderId}", orderId); try { // 处理逻辑 } catch (Exception ex) { _logger.LogError(ex, "处理订单 {OrderId} 时出错", orderId); } }}2. Serilog(结构化日志记录)
Serilog 在灵活性和流行度方面处于领先地位。其主要特点是结构化日志记录。您传递对象而不是字符串消息,这些对象会自动序列化为 JSON 或其他格式。这使得通过 Elasticsearch、Seq 或 Grafana 分析日志变得容易。
优点:与 .NET 完美集成,强大的 "enrichers"(上下文丰富),支持 sink(输出到文件、数据库、控制台、云服务)。
缺点:对于简单应用程序可能过于复杂,需要配置。
配置和使用示例:
using Serilog;
// 在 Program.cs 中配置Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console() .WriteTo.File("logs/myapp-.log", rollingInterval: RollingInterval.Day) .WriteTo.Seq("http://localhost:5341") .Enrich.WithProperty("Application", "MyApp") .CreateLogger();
try{ Log.Information("启动应用程序"); var user = new { Id = 1, Name = "Ivan" }; Log.Information("用户 {User} 已登录系统", user);}catch (Exception ex){ Log.Fatal(ex, "严重错误");}finally{ Log.CloseAndFlush();}3. NLog(性能和灵活性)
NLog 是另一个拥有丰富历史的强大框架。它以高性能和支持复杂的路由规则而闻名。配置可以在 XML 文件(nlog.config)中设置,也可以通过编程方式设置。
优点:非常快速,支持异步日志记录,能够通过电子邮件、数据库、EventLog 发送日志。对 .NET Framework 和 .NET Core 有出色的支持。
缺点:XML 配置语法可能显得繁琐。
nlog.config 配置示例:
<?xml version="1.0" encoding="utf-8" ?><nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets>