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

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

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

开始课程

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" />                    

推荐