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

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

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

开始课程

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

日志记录不仅仅是向文件写入消息。在现代 C# (.NET) 开发中,它是监控、调试和分析应用程序行为的强大工具。正确配置的日志记录可以快速发现错误、跟踪性能并构建分析。在本文中,我们将介绍 .NET 中最流行且高效的库,以及它们的最佳实践。



为什么需要专业的日志记录?

基础的 Console.WriteLine 或 Debug.Write 不适合生产环境。真正的日志记录框架提供:

  • 日志级别(Trace、Debug、Information、Warning、Error、Critical)—— 过滤消息的重要性。
  • 结构化数据—— 以 JSON 格式记录日志,便于解析(ELK、Splunk)。
  • 多种接收器(Sinks/Targets)—— 写入文件、控制台、数据库、云服务(Azure、AWS)。
  • 配置—— 无需重新编译代码即可调整行为。
  • 异步性—— 最小化对应用程序性能的影响。


.NET 顶级库

我们介绍在 .NET 生态系统中占主导地位的四个主要解决方案。



1. Serilog —— 结构化日志的标准

Serilog 是 .NET 中最流行的库,它率先推广了 结构化日志 的概念。您无需拼接字符串,而是传递模板和参数,从而以机器可读的格式保存数据。

主要功能:

  • 与 .NET Core / .NET 5+ 深度集成。
  • 大量的接收器(Serilog.Sinks.Console、Serilog.Sinks.File、Serilog.Sinks.ElasticSearch)。
  • 支持 Enrichers,用于自动添加上下文(机器名、应用程序版本、线程 ID)。
  • 简洁清晰的 API。


Serilog 配置与使用示例:

using Serilog;

// 在 Program.cs 中配置 (.NET 6+)Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.Console() .WriteTo.File("logs/app-.log", rollingInterval: RollingInterval.Day) .Enrich.WithMachineName() .CreateLogger();

try{ Log.Information("应用程序已启动"); var userId = 123; Log.Information("用户 {UserId} 已登录", userId); // 异常示例 throw new InvalidOperationException("测试错误");}catch (Exception ex){ Log.Error(ex, "方法 {Method} 中发生严重错误", nameof(Main));}finally{ Log.CloseAndFlush();}


2. NLog —— 灵活且高性能

NLog 是最古老的框架之一,在高负载系统中表现出色。其主要特点是灵活的规则路由和开箱即用的异步写入支持。

关键特性:

  • 支持 XML、JSON 和基于代码的配置。
  • 内置按大小和时间轮转日志的支持。
  • 通过自定义 Target 实现可扩展性。
  • 在某些场景下比 Serilog 占用更少内存。


通过代码配置 NLog 的示例:

using NLog;using NLog.Config;using NLog.Targets;

// 配置日志记录器var config = new LoggingConfiguration();var consoleTarget = new ConsoleTarget("console");config.AddRule(LogLevel.Info, LogLevel.Fatal, consoleTarget);

var fileTarget = new FileTarget("file"){ FileName = "${basedir}/logs/${shortdate}.log", Layout = "${longdate} | ${level:uppercase=true} | ${message} ${exception:fo

推荐