C#怎么使用NLog记录日志_C# NLog日志框架配置教程【实用】

穿越時空

穿越時空

2026-05-08

1047人浏览

原创

nlog日志不写入文件主因是nlog.config未复制到输出目录或配置加载失败;需设“始终复制”,检查bin目录是否存在该文件,并确认asp.net core中无配置干扰。

c#怎么使用nlog记录日志_c# nlog日志框架配置教程【实用】

日志不写入文件?八成是 NLog.config 没复制到输出目录,或者 LogManager.GetCurrentClassLogger() 调用前配置就已加载失败——它不会报错,只会静默丢弃所有日志。

为什么 NLog.config 必须设为“始终复制”

运行时 LogManager 默认只从 bin/Debugbin/Release 目录加载配置。如果 NLog.config 仅存在于项目根目录但未复制过去,LogManager.Configuration 就是 null,后续所有 logger.Info() 都无效。

  • 右键 NLog.config → “属性” → “复制到输出目录” → 选“始终复制”
  • 检查输出目录下是否存在该文件;若没有,手动复制一次并观察是否开始出日志
  • 不要依赖“如果较新则复制”,某些构建缓存会导致它跳过更新
  • ASP.NET Core 项目中,还需确认 web.configappsettings.json 没有干扰 NLog 初始化顺序

LogManager.GetCurrentClassLogger() 的隐式行为和陷阱

这个方法看似简单,实则绑定两个关键逻辑:自动以 typeof(CurrentClass).FullName 命名 logger,并触发首次配置加载。一旦失败,无提示、无异常、无日志。

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载
  • 不能在静态构造函数或字段初始化器里调用它——此时配置尚未加载,LogManager.Configuration 仍为 null
  • 每个类建议只声明一个 static readonly ILogger 字段,避免重复创建 logger 实例
  • 若需按模块分组(如所有订单相关类共用 "Order"),改用 LogManager.GetLogger("Order"),而非依赖类名
  • 调试时可加一句 Console.WriteLine(LogManager.Configuration?.AllTargets.Count) 确认配置是否加载成功

文件目标(File target)常见配置项含义

fileNamearchiveEverymaxArchiveFiles 这三个参数协同决定日志怎么落盘、何时滚动、保留多久,配错会导致日志堆积或瞬间清空。

  • fileName="${basedir}/logs/${shortdate}.log":每天生成新文件,路径基于程序启动目录
  • archiveEvery="Day"archiveFileName="${basedir}/logs/archives/app.{#}.log" 配合使用才生效;单独设 archiveEvery 不会归档
  • maxArchiveFiles="30" 是指归档目录下的最大文件数,不是总日志天数(例如每天归档 1 个,就是最多存 30 天)
  • 若用 archiveAboveSize,必须同时设 archiveNumbering="Rolling",否则归档逻辑不触发

结构化日志在 NLog 中不是默认开启的

_logger.LogInformation("User {Id} logged in", userId),默认输出仍是纯文本 User {Id} logged in,字段 Id 不会被提取。要真正结构化,得靠 JsonLayout + 正确的 layout 配置。

  • 必须在 <target></target> 内显式指定 <layout xsi:type="JsonLayout"></layout>
  • 需启用 includeAllProperties="true",否则只有 messagelevel 等基础字段
  • 搭配 renderers 可控制字段名,例如 <attribute name="timestamp" layout="${longdate}"></attribute>
  • 注意:结构化日志会略微增加序列化开销,高吞吐场景下建议只对 Info 及以上级别启用

最常被忽略的一点:NLog 不读取 appsettings.json,哪怕你把连接字符串或路径变量放进去,它也视而不见。所有动态值要么硬编码进 NLog.config,要么通过代码注入 LogManager.Configuration.Variables,别指望自动桥接。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

528

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

1158

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

556

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

1051

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

148

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

202

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

526

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

137

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.2万人学习