C#如何进行日志记录 C#使用Serilog或NLog配置日志框架

Serilog和NLog是C#中常用日志框架,Serilog支持结构化日志和多种输出,适合现代日志系统集成;NLog通过XML配置灵活管理日志规则,性能优秀。两者均需正确配置输出目标、滚动策略并防止敏感信息泄露,选择取决于团队习惯与运维需求。

在C#开发中,良好的日志记录是排查问题、监控系统运行状态的重要手段。Serilog 和 NLog 是两个广泛使用的第三方日志框架,它们功能强大、配置灵活,支持多种输出目标(如控制台、文件、数据库、远程服务等)。下面介绍如何在 C# 项目中使用 Serilog 或 NLog 进行日志记录。

Serilog 的基本使用

Serilog 以结构化日志著称,特别适合与 Elasticsearch、Seq、Application Insights 等现代日志分析工具集成。

1. 安装 NuGet 包:

  • Serilog
  • Serilog.Sinks.Console
  • Serilog.Sinks.File

可以通过 NuGet 包管理器或命令行安装:

dotnet add package Serilog
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.File

2. 配置并初始化 Logger:

Program.cs 或应用启动处配置:

using Serilog;

Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("logs/myapp.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();

// 使用日志
Log.Information("应用程序启动");
Log.Warning("这是一个警告");
Log.Error("发生错误");

// 关闭并刷新日志(程序退出前)
Log.CloseAndFlush();

3. 在 ASP.NET Core 中集成:

替换默认日志提供者:

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog((context, services, configuration) => configuration
.WriteTo.Console()
.WriteTo.File("logs/app.log", rollingInterval: RollingInterval.Day))
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup();
});

NLog 的基本使用

NLog 是另一个成熟稳定的日志框架,配置主要通过 XML 文件完成,灵活性高,性能优秀。

1. 安装 NuGet 包:

  • NLog
  • NLog.Extensions.Logging

2. 添加 nlog.config 配置文件:

在项目根目录添加 nlog.config,设置“复制到输出目录”为“始终复制”:


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">


layout="${longdate} ${level:uppercase=true} ${message} ${exception:format=tostring}" />
layout="${colored-literal:text=${level:uppercase=true}:color=DarkRed} ${message}" />






3. 在 ASP.NET Core 中启用 NLog:

修改 Program.cs

using NLog;
using NLog.Web;

var builder = WebApplication.CreateBuilder(args);

// 添加 NLog
builder.Host.UseNLog();

var app = builder.Build();

// 正常配置中间件...

4. 在代码中使用:

private readonly ILogger _logger;

public HomeController(ILogger logger)
{
_logger = logger;
}

_logger.LogInformation("用户访问首页");
_logger.LogError(ex, "处理请求时出错");

选择建议

如果追求结构化日志和与现代日志平台的集成(如 Seq、Elasticsearch),推荐使用 Serilog。它的 API 清晰,链式配置直观。

如果偏好基于配置文件的管理方式,或者需要更细粒度的路由规则、条件写入等高级功能,NLog 更加合适,且对性能影响极小。

基本上就这些,两种框架都能很好地满足 C# 项目的日志需求,选择哪一个更多取决于团队习惯和运维体系。不复杂但容易忽略的是正确关闭日志、设置滚动策略和避免敏感信息泄露。