C# (.NET) 日志记录:最佳解决方案概览

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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>                    

推荐