在C#项目中使用NLog进行日志记录的方法步骤

 更新时间:2025年12月26日 09:39:57   作者:工业程序猿老赵  
这篇文章主要介绍了如何使用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 应用(主流场景)

  1. 在项目根目录新建 NLog.config 文件(右键文件 → 属性 → 复制到输出目录 → 选择「始终复制」);
  2. 粘贴以下基础配置(支持控制台 + 文件输出,可直接复用):
<?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:验证效果

  1. 运行程序,控制台会输出日志内容;
  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("查询失败");
            }
        }
    }
}

四、关键注意事项

  1. 配置文件属性:务必将 NLog.config 的「复制到输出目录」设为「始终复制」,否则程序运行时找不到配置;
  2. 日志级别控制
    • Trace/Debug:开发环境调试用,生产环境建议关闭(配置中 minlevel 设为 Info);
    • Info/Warn:生产环境常规记录;
    • Error/Fatal:必须记录,用于排查问题;
  3. 异常日志规范:记录错误时务必传入 Exception 对象,否则会丢失堆栈信息,无法定位问题;
  4. 性能优化:文件日志建议开启 concurrentWrites="true"(多线程安全),keepFileOpen="false"(避免文件锁定)。

总结

  1. 核心步骤:安装包 → 配置 NLog.config(定义输出目标 / 规则)→ 代码中创建 / 注入 ILogger → 输出不同级别日志(异常日志务必传 Exception 对象);
  2. 项目适配:控制台应用直接用 LogManager.GetCurrentClassLogger()ASP.NET Core 需集成依赖注入并调用 UseNLog()
  3. 关键规范:每个类对应一个 Logger(便于定位日志来源),异常日志必须包含堆栈信息,生产环境合理设置日志级别。

以上就是在C#项目中使用NLog进行日志记录的方法步骤的详细内容,更多关于C# NLog进行日志记录的资料请关注脚本之家其它相关文章!

相关文章

  • C#检测移动硬盘并获取移动硬盘盘符的方法

    C#检测移动硬盘并获取移动硬盘盘符的方法

    这篇文章主要介绍了利用C#检测移动硬盘并获取移动硬盘盘符
    2017-12-12
  • C# AE之返回上一级和下一级的实战操作

    C# AE之返回上一级和下一级的实战操作

    这篇文章主要介绍了C# AE之返回上一级和下一级的实战操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • C#中的dynamic与var区别对比分析

    C#中的dynamic与var区别对比分析

    var和dynamic代表了C#语言的两种不同设计理念:一个是保证类型安全但提供语法糖简化代码,另一个是提供动态特性以增强灵活性,这篇文章主要介绍了C#中的dynamic与var看似相似却迥然不同,需要的朋友可以参考下
    2025-05-05
  • 详解Unity入门之GameObject

    详解Unity入门之GameObject

    Unity是一个Component-Based的引擎,所有物体都是GameObject。本文将详细介绍GameObject和MonoBehaviour,感兴趣的同学,可以参考下。
    2021-05-05
  • C#笔记之EF Code First 数据模型 数据迁移

    C#笔记之EF Code First 数据模型 数据迁移

    EF 中 Code First 的数据迁移网上有很多资料,我这份并没什么特别。Code First 创建视图网上也有很多资料,但好像很麻烦,而且亲测好像是无效的方法(可能是我太笨,没搞成功),我摸索出了一种简单有效的方法,这里分享给大家
    2021-09-09
  • C#使用stackalloc分配堆栈内存和非托管类型详解

    C#使用stackalloc分配堆栈内存和非托管类型详解

    这篇文章主要为大家介绍了C#使用stackalloc分配堆栈内存和非托管类型详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2022-12-12
  • WPF Trigger改变属性无效问题排查示例详解

    WPF Trigger改变属性无效问题排查示例详解

    这篇文章主要为大家介绍了WPF Trigger改变属性无效问题排查示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Unity3D实现飞机大战游戏(2)

    Unity3D实现飞机大战游戏(2)

    这篇文章主要为大家详细介绍了Unity3D实现飞机大战游戏的第二部分,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • 基于C#的winform实现数字华容道游戏

    基于C#的winform实现数字华容道游戏

    这篇文章主要为大家详细介绍了基于C#的winform实现数字华容道游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 关于C#中yield关键字的深入解析

    关于C#中yield关键字的深入解析

    这篇文章主要给大家介绍了关于C#中yield关键字的深入解析,文中通过示例代码介绍的非常详细,对大家的学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11

最新评论