在C#项目中使用NLog进行日志记录的方法步骤
作者:工业程序猿老赵
这篇文章主要介绍了如何使用NLog进行日志记录,包括安装NuGet包、配置NLog.config文件、在代码中使用Logger以及验证日志输出,文章详细说明了在控制台/桌面应用和ASP.NET Core Web应用中的具体步骤,并强调了关键注意事项,需要的朋友可以参考下
一、整体流程(核心步骤)
使用 NLog 的核心流程可总结为:安装 NuGet 包 → 配置 NLog.config → 代码中初始化 / 使用 Logger → 验证日志输出,下面分项目类型详细说明。
二、控制台 / 桌面应用(最基础场景)
步骤 1:安装 NLog 包
打开项目的 NuGet 包管理器,安装核心包:
# .NET CLI 命令(推荐) dotnet add package NLog # 或 NuGet 包管理器控制台 Install-Package NLog
步骤 2:添加 NLog.config 配置文件
三、ASP.NETCore Web 应用(主流场景)
- 在项目根目录新建
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"
autoReload="true" <!-- 配置修改后自动生效,无需重启 -->
throwConfigExceptions="true"> <!-- 开发时开启,配置错误抛异常 -->
<!-- 变量定义:简化重复配置 -->
<variable name="logDir" value="${basedir}/logs"/>
<variable name="logLayout" value="${longdate} | ${level:uppercase=true} | ${logger} | ${message} ${exception:format=ToString}"/>
<!-- 输出目标:控制台 + 按天分割的文件 -->
<targets>
<!-- 控制台输出(开发调试) -->
<target name="console" xsi:type="Console" layout="${logLayout}"/>
<!-- 文件输出(生产环境核心) -->
<target name="file" xsi:type="File"
fileName="${logDir}/${shortdate}.log" <!-- 日志路径:项目目录/logs/2025-12-25.log -->
archiveEvery="Day" <!-- 按天归档 -->
maxArchiveFiles="30" <!-- 保留30天日志 -->
encoding="UTF-8"
layout="${logLayout}"/>
</targets>
<!-- 日志规则:所有Info及以上级别输出到控制台+文件 -->
<rules>
<logger name="*" minlevel="Info" writeTo="console,file" />
</rules>
</nlog>步骤 1:C# 代码中使用 NLog
using NLog;
namespace NLogDemo
{
class Program
{
// 核心:创建Logger(推荐每个类一个,用当前类名命名,便于定位日志来源)
private static readonly ILogger _logger = LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
try
{
// 1. 输出不同级别的日志(按需选择)
_logger.Info("程序启动成功,开始执行业务逻辑");
_logger.Warn("注意:当前内存使用率超过80%");
// 模拟业务操作
var userId = 1001;
_logger.Info($"用户 {userId} 发起查询请求");
// 2. 模拟异常,记录带堆栈的错误日志(核心场景)
throw new InvalidOperationException("数据库查询超时");
}
catch (Exception ex)
{
// 第一个参数:异常对象(自动记录堆栈);第二个参数:自定义日志消息
_logger.Error(ex, "执行业务逻辑时发生错误");
}
finally
{
// 释放NLog资源(控制台应用结束时建议调用)
LogManager.Shutdown();
}
}
}
}步骤 2:验证效果
- 运行程序,控制台会输出日志内容;
- 查看项目输出目录(如
bin/Debug/net8.0/logs),会生成以当天日期命名的.log文件,包含完整日志。
步骤 3:安装适配包
dotnet add package NLog.Web.AspNetCore
步骤 4:配置 NLog.config
复用上面的 NLog.config 文件(无需修改,直接复制到项目根目录,设置「始终复制」)。
步骤 5:Program.cs 中集成 NLog
using NLog; using NLog.Web; var builder = WebApplication.CreateBuilder(args); // 1. 清除.NET默认日志提供器,启用NLog builder.Logging.ClearProviders(); builder.Host.UseNLog(); // 注册NLog到ASP.NET Core依赖注入 // 2. 添加MVC等服务(常规操作) builder.Services.AddControllersWithViews(); var app = builder.Build(); // 3. 中间件配置(常规操作) app.UseRouting(); app.UseEndpoints(endpoints => endpoints.MapControllers()); app.Run();
步骤 6:Controller/Service 中使用
通过依赖注入获取 ILogger(ASP.NET Core 推荐方式):
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace NLogWebDemo.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class UserController : ControllerBase
{
// 注入ILogger(泛型参数为当前类,便于日志定位)
private readonly ILogger<UserController> _logger;
public UserController(ILogger<UserController> logger)
{
_logger = logger;
}
[HttpGet("{id}")]
public IActionResult Get(int id)
{
// 记录普通日志
_logger.LogInformation("接收到用户查询请求,ID:{UserId}", id);
try
{
// 模拟业务逻辑
if (id <= 0)
{
throw new ArgumentException("用户ID不能为负数");
}
return Ok(new { Id = id, Name = "张三" });
}
catch (Exception ex)
{
// 记录错误日志
_logger.LogError(ex, "查询用户信息失败,ID:{UserId}", id);
return BadRequest("查询失败");
}
}
}
}四、关键注意事项
- 配置文件属性:务必将
NLog.config的「复制到输出目录」设为「始终复制」,否则程序运行时找不到配置; - 日志级别控制:
Trace/Debug:开发环境调试用,生产环境建议关闭(配置中minlevel设为Info);Info/Warn:生产环境常规记录;Error/Fatal:必须记录,用于排查问题;
- 异常日志规范:记录错误时务必传入
Exception对象,否则会丢失堆栈信息,无法定位问题; - 性能优化:文件日志建议开启
concurrentWrites="true"(多线程安全),keepFileOpen="false"(避免文件锁定)。
总结
- 核心步骤:安装包 → 配置
NLog.config(定义输出目标 / 规则)→ 代码中创建 / 注入ILogger→ 输出不同级别日志(异常日志务必传Exception对象); - 项目适配:控制台应用直接用
LogManager.GetCurrentClassLogger(),ASP.NET Core 需集成依赖注入并调用UseNLog(); - 关键规范:每个类对应一个 Logger(便于定位日志来源),异常日志必须包含堆栈信息,生产环境合理设置日志级别。
以上就是在C#项目中使用NLog进行日志记录的方法步骤的详细内容,更多关于C# NLog进行日志记录的资料请关注脚本之家其它相关文章!
