- 后端
- 运维观测
【免费下载链接】NLog
NLog - Flexible and Structured Logging for various .NET Platforms
本篇技术指南以仓库根目录的 packages-and-status.md 为骨架,结合 appveyor.yml 构建配置与src/下各扩展包的源码实现,系统梳理 NLog 在 .NET 生态中的完整包矩阵:哪些包由本仓库直接构建发布、哪些包托管在独立仓库、每个包解决什么问题、如何安装注册、以及如何解读包旁的构建状态与 NuGet 版本徽章。读完本文,你将能够根据日志写入目标(文件、数据库、网络、邮件、Windows 系统日志等)与运行平台(桌面、Web、移动、云),准确选取并配置对应的 NLog 扩展包。
一、文档定位:一张表看懂 NLog 的包矩阵
packages-and-status.md 全文是一张「包 × 构建状态 × NuGet 版本」的总览表,共列出 33 个 NLog 相关 NuGet 包。它是 NLog 官方对「我应该装哪个包」这一问题的第一手答复:每个包对应一个 AppVeyor 持续集成构建徽章(表明该项目的最新构建是否通过)和一个 NuGet 版本徽章(表明当前可安装的稳定版/预览版)。
根据表中信息可进一步将包分为三大类:
| 类别 | 包名 | 说明 |
|---|---|---|
| 核心包(本仓库构建) | NLog、NLog.Schema、NLog.OutputDebugString、NLog.RegEx、NLog.Targets.AtomicFile、NLog.Targets.GZipFile、NLog.WindowsEventLog | 源码位于本仓库src/目录,构建徽章统一指向主项目nlog/nlog的dev分支 |
| 托管于独立仓库的扩展包 | NLog.Database、NLog.Extensions.Logging、NLog.MailKit、NLog.Web、NLog.Targets.Network、NLog.Targets.WebService等 | 每个包或每组包拥有独立的 AppVeyor 项目与构建徽章 |
| 辅助/规范包 | NLog.Schema | XSD 架构文件包,为编辑NLog.config提供 IntelliSense |
一个值得注意的细节:表中与主项目共用同一个nlog/nlogdev分支构建徽章的包(NLog、NLog.OutputDebugString、NLog.RegEx、NLog.Schema、NLog.Targets.AtomicFile、NLog.Targets.GZipFile、NLog.WindowsEventLog),其源码就位于本仓库;而使用各自独立徽章的包(如NLog.Database、NLog.MailKit、NLog.Targets.MauiLog、NLog.Windows.Forms等)则由各自独立的仓库维护。这一特征可以直接作为判断「该扩展是否在本仓库内开发」的依据。
二、构建与发布流水线:徽章背后发生了什么
表中的构建徽章并非装饰,它对应 appveyor.yml 中定义的完整 CI/CD 流水线。从该文件可以读出 NLog 官方对包质量的几项硬性要求:
- 版本号体系:
version: 6.0.0-{build},即主版本号目前为 6.x,与 src/NLog/NLog.csproj 中的AssemblyVersion 6.0.0.0保持一致;{build}由 AppVeyor 自动递增。 - 双平台矩阵:构建同时在
Visual Studio 2026(Windows)与Ubuntu2204(Linux)两个镜像上执行,保证跨平台能力;fast_finish: true让任一平台失败时尽快结束。 - 跳过噪音构建:
skip_tags: true与skip_branch_with_pr: true避免打标签和 PR 分支触发冗余构建;nuget.disable_publish_on_pr: true保证 PR 不会意外发布 NuGet 包。 - 质量门禁:Windows 平台上依次执行
build.ps1、基于 tools/CheckSourceCode 的源码规范检查(NLog.SourceCodeTests.exe)、Test-XmlFile.ps1(校验 XSD 配置文件的合法性)以及 run-tests.ps1 全量测试;Linux 平台同样执行run-tests.ps1。 - 发布策略:只有在
master与dev分支上才执行 NuGet 发布步骤,并将构建产物artifacts\*.nupkg与对应的符号包artifacts\*.snupkg作为构建工件归档。
因此,当你在表中看到某个包左侧的 AppVeyor 徽章为绿色时,意味着它刚刚通过了上述双平台构建、源码规范检查、XSD 校验与全量单元测试,可以被放心引入。
三、核心包与仓库内置扩展:源码级深入
本仓库src/下直接维护了 6 个可独立发布的扩展包(不含主包NLog)。它们各自的 README 与源码共同构成了「如何注册、如何配置」的完整答案。
3.1 NLog:核心日志框架
NLog是这一切的基础包,提供Logger、Target、LayoutRenderer、Filter等全部核心抽象,以及基于 LogManager.cs、LogFactory.cs 的配置加载能力。所有扩展包都以它为依赖,向ConfigurationItemFactory注册新的 Target 或 LayoutRenderer。
3.2 NLog.OutputDebugString:调试器输出通道
NLog.OutputDebugString包提供OutputDebugStringTarget,通过 Win32OutputDebugString()API 将日志发送给调试器监视工具(如 DebugView)。其实现在 OutputDebugStringTarget.cs 中直接继承TargetWithLayoutHeaderAndFooter,在Write()方法里将渲染后的布局文本交给 NativeMethods.cs 中 P/Invoke 声明的kernel32.dll!OutputDebugString调用。
- XML 类型别名:
OutputDebugString。 - 默认布局:
${longdate}|${level:uppercase=true}|${logger}|${message:withexception=true}。 - 注册方式(见 src/NLog.OutputDebugString/README.md):
<extensions> <add assembly="NLog.OutputDebugString"/> </extensions>或使用 Fluent 配置 API:
LogManager.Setup().SetupExtensions(ext => { ext.RegisterTarget<NLog.Targets.OutputDebugStringTarget>(); });适用场景:Windows 桌面/服务端开发中需要把日志直接汇入调试器输出窗口、与调试工具联动排查问题的场景。
3.3 NLog.RegEx:正则表达式增强三件套
NLog.RegEx包把 .NET 正则能力注入到三个不同环节,全部围绕 RegexHelper.cs 这一内部工具类展开(统一管理IgnoreCase、WholeWords、CompileRegex等选项并重建Regex实例):
regex-replace布局渲染器(RegexReplaceLayoutRendererWrapper.cs):对内部布局的输出做正则查找替换,支持命名分组定向替换(ReplaceGroupName)。官方示例为${regex-replace:searchFor=\n+:replaceWith=-:inner=${message}}。其关键参数包括:SearchFor:搜索的正则或文本(必填,为空会在初始化时抛出NLogConfigurationException);ReplaceWith:替换文本;ReplaceGroupName:仅替换命中的指定命名分组;IgnoreCase/WholeWords:大小写与整词匹配;CompileRegex:是否编译正则(提升速度但增加内存,否则走 Regex Cache)。
测试用例 tests/NLog.RegEx.Tests/RegexReplaceTests.cs 覆盖了无正则替换、忽略大小写、整词匹配、以及用复杂正则脱敏银行卡号(
1234-5678-1234-5678→XXXX-XXXX-XXXX-5678)等真实场景,可作为配置语法的最直观参考。regex-matches条件方法(RegexConditionMethods.cs):在<when>过滤器或规则条件中判断字符串是否匹配正则,返回布尔值,可选第三个参数传入RegexOptions(如ignorecase、multiline,逗号分隔)。其行为由 tests/NLog.RegEx.Tests/ConditionEvaluatorTests.cs 验证。ConsoleWordHighlightingRuleRegex(ConsoleWordHighlightingRuleRegex.cs):为ColoredConsoleTarget提供基于正则的单词高亮规则,可用Regex属性替代普通text匹配,参见 tests/NLog.RegEx.Tests/ColoredConsoleTargetTests.cs。
适用场景:日志脱敏(信用卡号、手机号)、多行日志折叠为单行、控制台关键字着色、按正则路由/过滤日志。
3.4 NLog.Targets.AtomicFile:多进程原子追加写文件
NLog.Targets.AtomicFile是标准FileTarget的扩展,专为「多进程并发写同一个日志文件」设计。类型别名同时注册了AtomFile与AtomicFile(见 AtomicFileTarget.cs)。
其核心原理在CreateFileStream中:当ConcurrentWrites(默认true)、KeepFileOpen同时满足且未开启ReplaceFileContentsOnEachWrite时,不再使用普通FileStream,而是借助操作系统原子追加语义:
- Windows:以
FILE_APPEND_DATA | SYNCHRONIZE权限打开文件(Internal/NativeMethods.cs 定义了对应的 Win32 常量),写入时由系统保证追加位置总是文件末尾; - Linux / macOS:直接调用
libc的open(),组合O_WRONLY | O_CREAT | O_APPEND | O_CLOEXEC标志。其中O_APPEND保证每次写入都定位到文件末尾,O_CLOEXEC防止文件描述符在exec()时泄漏给子进程。
实现上刻意将bufferSize设为 1,即不做内部缓冲、直接从用户缓冲区写入,以换取原子性;打开失败时最多重试 5 次并记录内部日志。完整配置示例见 src/NLog.Targets.AtomicFile/README.md:
<nlog> <extensions> <add assembly="NLog.Targets.AtomicFile"/> </extensions> <targets> <target xsi:type="AtomFile" name="logfile" fileName="${basedir}/logs/application.log" layout="${longdate}|${level:uppercase=true}|${message} ${exception:format=tostring}" /> </targets> </nlog>多进程正确性由 AtomicFileTests.cs 与 AtomicWritesMultiProcessTests.cs 验证(后者让快、慢两个进程并发写同一文件并配合归档,断言归档文件命名与内容均正确)。
适用场景:同一主机上多个进程/服务共享同一日志文件,且需要保证写入不互相覆盖。
3.5 NLog.Targets.GZipFile:写入即压缩的日志文件
NLog.Targets.GZipFile同样是FileTarget的扩展,通过GZipStream在写入时实时压缩日志内容(GZipFileTarget.cs)。它有几个值得注意的约束与默认值:
- 构造函数默认
ArchiveOldFileOnStartup = true——因为 gzip 无法追加写已有文件,必须把旧文件归档后重开新文件; InitializeTarget阶段强制校验:若KeepFileOpen != true或ArchiveOldFileOnStartup != true,会直接抛出NLogConfigurationException;EnableArchiveFileCompression(默认true)可整体开关压缩;CompressionLevel(默认Fastest)可切换为Optimal或NoCompression;- 当压缩被禁用或条件不满足时,会回退到普通
FileStream并写入内部日志提示; - 支持
AutoFlush与BufferSize组合:未开启AutoFlush且BufferSize > 0时,在压缩流外层再包一层BufferedStream。
注册方式与AtomFile完全一致(<add assembly="NLog.Targets.GZipFile"/>或RegisterTarget<NLog.Targets.GZipFileTarget>()),类型别名为GZipFile。测试 GZipFileTests.cs 验证了基本写入、AutoFlush=false、Header/Footer/BOM、ArchiveAboveSize滚动归档以及启动时归档旧文件等全部行为。
适用场景:磁盘空间敏感、需要长期留存且不要求直接 tail 可读的日志文件。
3.6 NLog.WindowsEventLog:Windows 事件日志
NLog.WindowsEventLog提供写入 Windows EventLog 的 Target(README 见 src/NLog.WindowsEventLog/README.md),XML 类型别名为eventlog,代码注册方式为RegisterTarget<NLog.Targets.EventLogTarget>()。它面向 Windows 平台的系统日志审计与运维监控场景。
四、托管于独立仓库的扩展包:按场景选型
表中其余包由独立的 GitHub 仓库开发与发布(表格中仅给出包名与构建徽章,未在本仓库内保留源码)。根据包名即可映射到明确的日志消费场景:
| 场景 | 推荐包 | 说明 |
|---|---|---|
| 数据库 | NLog.Database | 写 SQL Server / Oracle / MySQL / PostgreSQL 等数据库 |
| 消息队列 | NLog.MSMQ | 写 Microsoft Message Queuing |
| 邮件 | NLog.MailKit、NLog.Targets.Mail | 基于 MailKit 或传统 SmtpClient 发送日志邮件 |
| 网络/远程 | NLog.Targets.Network、NLog.Targets.HttpClient、NLog.Targets.WebService、NLog.Targets.OpenTelemetryHttp、NLog.Targets.Trace、NLog.Wcf | TCP/UDP、HTTP、WebService、OpenTelemetry、WCF 等通道 |
| 文件增强 | NLog.Targets.ConcurrentFile | 并发文件写入的另一种选择 |
| 诊断/遥测 | NLog.DiagnosticSource、NLog.Etw、NLog.PerformanceCounter、NLog.Elmah | ETW、DiagnosticSource、性能计数器、ELMAH 集成 |
| 框架集成 | NLog.Extensions.Logging、NLog.Web、NLog.Web.AspNetCore、NLog.Owin.Logging | Microsoft.Extensions.Logging、ASP.NET(Core)、OWIN 桥接 |
| Windows 集成 | NLog.WindowsIdentity、NLog.WindowsRegistry、NLog.Windows.Forms | 身份、注册表、WinForms 控件 |
| 移动/云 | NLog.Targets.AppCenter、NLog.Targets.MauiLog | App Center 与 .NET MAUI 平台 |
这些包与核心包共同遵循同一套扩展注册协议(见下节),因此「安装包 → 注册扩展 → 配置 Target」的流程完全一致,学习成本很低。
五、扩展包的统一注册协议
无论包来自本仓库还是独立仓库,NLog 扩展的接入方式都只有两种(各包 README 反复强调):
- XML 配置注册(编辑
NLog.config,在<nlog>根节点下):
<nlog> <extensions> <add assembly="NLog.Targets.GZipFile"/> <add assembly="NLog.RegEx"/> <add assembly="NLog.OutputDebugString"/> </extensions> <targets> <!-- 此处即可使用各扩展注册的 xsi:type 别名 --> </targets> </nlog>- 代码注册(Fluent 配置 API,
LogManager.Setup()入口):
LogManager.Setup().SetupExtensions(ext => { ext.RegisterTarget<NLog.Targets.GZipFileTarget>(); ext.RegisterTarget<NLog.Targets.AtomicFileTarget>(); ext.RegisterLayoutRenderer<NLog.LayoutRenderers.Wrappers.RegexReplaceLayoutRendererWrapper>(); ext.RegisterTarget<NLog.Targets.OutputDebugStringTarget>(); });要点:只有完成上述注册,NLog.config中的xsi:type="AtomFile"、xsi:type="GZipFile"、${regex-replace:...}等类型别名才会被 ConfigurationItemFactory 解析为对应类型。
六、辅助包 NLog.Schema:给 NLog.config 加 IntelliSense
NLog.Schema不提供任何 Target,而是一个 XSD 架构包。根据 NLog.Schema.nuspec,它会在安装时通过 NLog.Schema.targets 中的AfterTargets="ResolveReferences"钩子把NLog.xsd拷贝到项目目录,让 Visual Studio 编辑NLog.config时获得属性补全与校验:
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"> </nlog>这也解释了流水线中 Test-XmlFile.ps1 的存在意义:仓库会对示例配置文件执行 XSD 合法性校验,确保文档中的配置示例始终可解析、可运行。
七、如何阅读包表格中的徽章与版本
回到 packages-and-status.md 本身,解读时留意两个维度:
- 构建状态(Build status):指向 AppVeyor 项目某一分支。本仓库内置包统一指向
nlog/nlog的dev分支,外部包指向各自仓库的master分支。绿色代表最新提交构建通过。 - NuGet 版本(NuGet):大部分内置扩展与主包使用
vpre(prerelease)徽章,意味着当前推荐渠道可能包含预览版;而NLog.DiagnosticSource、NLog.Elmah、NLog.Etw、NLog.MailKit、NLog.Targets.AppCenter、NLog.Targets.ConcurrentFile、NLog.Targets.HttpClient、NLog.Targets.Mail、NLog.Targets.MauiLog、NLog.Targets.Network、NLog.Targets.OpenTelemetryHttp、NLog.Targets.Trace、NLog.Targets.WebService、NLog.Windows.Forms、NLog.Owin.Logging等包使用稳定版(v)徽章。在需要稳定依赖时,优先选择稳定徽章对应的版本即可。
八、结论与实践建议
从 packages-and-status.md 出发,结合仓库源码可以得出以下选型与落地建议:
- 基础安装:项目首先引入
NLog主包;需要配置 IntelliSense 时加装NLog.Schema。 - 文件日志:单进程用内置
FileTarget;多进程并发写同一文件选NLog.Targets.AtomicFile(AtomFile);磁盘紧张选NLog.Targets.GZipFile(GZipFile),但需接受KeepFileOpen=true与ArchiveOldFileOnStartup=true的约束。 - 内容加工:需要正则替换、脱敏、高亮或正则过滤时引入
NLog.RegEx(regex-replace、regex-matches、ConsoleWordHighlightingRuleRegex)。 - 系统/调试集成:Windows 调试期用
NLog.OutputDebugString,生产审计用NLog.WindowsEventLog。 - 其余通道:数据库、邮件、网络、ASP.NET Core、OpenTelemetry 等按上表选型,安装后统一走「
<extensions>注册 + 配置 Target」两步接入。
所有扩展的注册协议、配置示例与行为约束都可以在本仓库各包目录的 README、源码实现(如 AtomicFileTarget.cs、GZipFileTarget.cs、RegexReplaceLayoutRendererWrapper.cs)以及tests/下的对应测试用例中找到第一手依据,可放心按本文指引逐项验证与落地。
- 后端
- 运维观测
【免费下载链接】NLog
NLog - Flexible and Structured Logging for various .NET Platforms
相关推荐
终极指南:NLog扩展包生态系统从入门到精通
终极指南:NLog扩展包生态系统从入门到精通 NLog作为.NET平台最强大的日志记录库,其真正的威力在于丰富的扩展包生态系统。无论你是.NET开发新手还是资深
后端运维观测htmx 扩展机制完全指南:从核心扩展到社区生态与自定义扩展开发
htmx 扩展机制完全指南:从核心扩展到社区生态与自定义扩展开发 htmx 提供了一套扩展(Extensions)机制,用以在核心库之外按需增强其超媒体基础设施
前端Web框架IntelBluetoothFirmware安全性分析:内核扩展权限管理与固件验证机制
IntelBluetoothFirmware安全性分析:内核扩展权限管理与固件验证机制 IntelBluetoothFirmware是一款为macOS系统开发的
知识管理跨平台插件系统
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考