引言:为什么日志记录很重要?
\n\n想象一下,您的 C# 应用程序正在生产环境中运行。突然,用户报告了一个错误,但您无法理解哪里出了问题。没有日志,您就像没有仪表的飞行员。日志记录是记录应用程序运行信息的过程:错误、警告、调试消息和关键事件。
\n\n在本文中,我们将为 C# (.NET) 的初学者开发者解析日志记录的最佳实践。您将了解如何配置日志记录、使用哪些工具以及如何避免典型错误。
\n\n1. 选择 C# 中的日志记录工具
\n\n在 .NET 生态系统中,有几种流行的日志记录库。对于初学者,我们推荐三个主要选项:
\n\n1.1. 内置 ILogger (Microsoft.Extensions.Logging)
\n\n从 .NET Core 开始,Microsoft 提供了内置的 ILogger 接口。它易于使用,无需安装第三方库。
using Microsoft.Extensions.Logging;\n\npublic class OrderService\n{\n private readonly ILogger<OrderService> _logger;\n\n public OrderService(ILogger<OrderService> logger)\n {\n _logger = logger;\n }\n\n public void ProcessOrder(int orderId)\n {\n _logger.LogInformation("正在处理订单 {OrderId}", orderId);\n // 处理逻辑\n }\n}\n\n1.2. Serilog — 灵活且强大
\n\nSerilog 是最流行的库之一。它支持结构化日志记录,便于数据分析。通过 NuGet 安装:Install-Package Serilog.AspNetCore
using Serilog;\n\npublic class Program\n{\n public static void Main(string[] args)\n {\n Log.Logger = new LoggerConfiguration()\n .MinimumLevel.Debug()\n .WriteTo.Console()\n .WriteTo.File("logs/app.log", rollingInterval: RollingInterval.Day)\n .CreateLogger();\n\n try\n {\n Log.Information("应用程序已启动");\n CreateHostBuilder(args).Build().Run();\n }\n catch (Exception ex)\n {\n Log.Fatal(ex, "应用程序因错误而终止");\n }\n finally\n {\n Log.CloseAndFlush();\n }\n }\n}\n\n1.3. NLog — 经典选择
\n\nNLog 是另一个成熟的库,通过配置文件提供广泛的配置选项。
\n\n// 通过 appsettings.json 配置\n{\n "NLog": {\n "targets": {\n "console": {\n "type": "Console",\n "layout": "${longdate}|${level:uppercase=true}|${message}"\n },\n "file": {\n "type": "File",\n "fileName": "logs/app.log",\n "layout": "${longdate}|${level:uppercase=true}|${message}"\n }\n },\n "rules": [\n { "logger": "*", "minLevel": "Info", "writeTo": "console,file" }\n ]\n }\n}\n\n2. 日志级别:何时使用什么
\n\n正确使用日志级别是良好实践的基础。在 C# (.NET) 中定义了以下级别(从最严重到最不严重):
\n\n- \n
- Trace (0) — 最详细的调试信息。仅用于深度诊断。 \n
- Debug (1) — 供开发人员使用的调试消息。在开发环境中启用,但在生产环境中禁用。 \n
- Information (2) — 关于应用程序运行的一般信息消息(启动、成功操作)。 \n
- Warning (3) — 关于潜在问题的警告,这些不是错误(例如,执行时间超限)。 \n
- Error (4) — 需要注意但不会导致应用程序崩溃的错误。 \n
- Critical (5) — 导致应用程序崩溃的严重错误。