[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"consumer-news-detail-1021":3,"consumer-news-interaction-1021":40,"consumer-news-related-1021":43},{"detail":4,"item":35},{"card":5,"schemaVersion":22,"fields":23,"content":29},{"id":6,"kind":7,"targetType":8,"targetId":9,"subtype":7,"typeLabel":10,"title":11,"subtitle":12,"summary":13,"coverUrl":14,"badgeText":14,"href":15,"sourceName":12,"meta":16,"metrics":19,"tags":20,"resolved":21},"NEWS_ARTICLE:1021","news","NEWS_ARTICLE",1021,"资讯","MiniLog 1.0 GA 发布：零分配、零依赖的 .NET 高性能日志框架","博客园","MiniLog 是零外部依赖、零分配的 .NET 高性能日志框架，API 借鉴 log4net\u002FNLog 的派发模型（Logger → Appender → Layout），底层用结构体日志条目、源生成器与零分配渲染实现热路径零 GC，可作为 Microsoft.Extensions.Logging","","\u002Fnews\u002F1021",[17,18],"2026","软件开发",{},[18],true,"consumer-content-detail-v1",{"sourceName":12,"authorName":24,"categoryName":18,"summary":13,"description":13,"publishTime":25,"updateTime":26,"sourceUrl":27,"language":28},"风云","2026-09-06T18:38","2026-09-11T15:22:03","https:\u002F\u002Fwww.cnblogs.com\u002Fnetcasewqs\u002Fp\u002F22864052","中文",{"format":30,"policy":31,"normalized":21,"html":32,"text":33,"wordCount":34,"hasBody":21},"HTML","NEWS_CONTENT_V1","MiniLog\n\u003Cblockquote>\n \u003Cp>轻量、高性能的 .NET 日志组件库，\u003Cstrong>零外部依赖\u003C\u002Fstrong>。API 形态借鉴 log4net \u002F NLog 的派发模型（Logger → Appender → Layout），但在底层采用\u003Cstrong>结构体日志条目\u003C\u002Fstrong>、\u003Cstrong>零分配渲染\u003C\u002Fstrong>与\u003Cstrong>源生成器\u003C\u002Fstrong>，定位为「现代、低 GC 压力、可替代 MS Logging 的高性能日志框架」。\u003C\u002Fp>\n \u003Cp>核心技术亮点：\u003C\u002Fp>\n \u003Cul>\n  \u003Cli>\u003Cp>\u003Cstrong>零分配渲染\u003C\u002Fstrong> —— \u003Ccode>LogEntry\u003C\u002Fcode> 值语义结构体 + \u003Ccode>ReusableDelegateWriter\u003C\u002Fcode> + \u003Ccode>ValueStringBuilder\u003C\u002Fcode>（栈缓冲 \u002F \u003Ccode>ArrayPool\u003C\u002Fcode>），热路径零 GC\u003C\u002Fp>\u003C\u002Fli>\n  \u003Cli>\u003Cp>\u003Cstrong>零装箱派发\u003C\u002Fstrong> —— 源生成器经 \u003Ccode>ILogArgumentBag\u003C\u002Fcode> 泛型参数袋把结构化参数穿过整条派发链，启用路径不装箱\u003C\u002Fp>\u003C\u002Fli>\n  \u003Cli>\u003Cp>\u003Cstrong>ANSI 彩色分级控制台\u003C\u002Fstrong> —— 可选、\u003Ccode>EnableColors\u003C\u002Fcode> 默认关、跨平台、不依赖 \u003Ccode>Console\u003C\u002Fcode> 全局颜色状态\u003C\u002Fp>\u003C\u002Fli>\n  \u003Cli>\u003Cp>\u003Cstrong>源生成器双后端\u003C\u002Fstrong> —— \u003Ccode>[Log]\u003C\u002Fcode>（注入 \u003Ccode>ILog\u003C\u002Fcode> 字段）+ \u003Ccode>[LoggerMessage]\u003C\u002Fcode>（强类型零装箱），一份声明通吃 MiniLog 与 Microsoft.Extensions.Logging\u003C\u002Fp>\u003C\u002Fli>\n  \u003Cli>\u003Cp>\u003Cstrong>8 种 Appender + 8 种过滤器 + 11×7 文件\u002F目录滚动\u003C\u002Fstrong>\u003C\u002Fp>\u003C\u002Fli>\n \u003C\u002Ful>\n\u003C\u002Fblockquote>\n\u003Cblockquote>\n \u003Cp>\u003Cstrong>版本\u003C\u002Fstrong>: 1.0.0（GA）| \u003Cstrong>目标框架\u003C\u002Fstrong>: .NET 8.0 \u002F .NET 10.0 | \u003Cstrong>许可证\u003C\u002Fstrong>: MIT\u003C\u002Fp>\n \u003Cp>\u003Cstrong>状态\u003C\u002Fstrong>：首个正式稳定版（GA）。可从源码构建或引用本地包使用；包名 \u003Ccode>MiniLog\u003C\u002Fcode> 经核查在 nuget.org 可用、无冲突。\u003C\u002Fp>\n \u003Cp>源码仓库：\u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Chr>\n\u003Ch2>设计渊源\u003C\u002Fh2>\n\u003Cp>MiniLog 并非从零开始设计，其内核吸收了作者在前公司连续运行 10 余年的日志组件经验。该组件在大数据吞吐场景下，内存与 CPU 占用均低于同期主流开源方案。其滚动策略可在目录、文件、时间维度上叠加容量上限灵活组合，运维友好。当错误发生时，仅凭年、月、日、时即可精确定位对应历史日志，排障效率显著提升。MiniLog 将这些经过产线长期验证的设计理念，以零分配、零依赖的现代 .NET 实现重新落地。\u003C\u002Fp>\n\u003Ch2>一、特性一览\u003C\u002Fh2>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>特性\u003C\u002Fth>\n   \u003Cth>说明\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>零外部依赖\u003C\u002Ftd>\n   \u003Ctd>纯 .NET 实现，不引入任何第三方包\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>多格式配置\u003C\u002Ftd>\n   \u003Ctd>XML \u002F JSON \u002F INI 三种文件 + Fluent Builder；XML 带 XSD、JSON 带 JSON Schema，IDE 智能提示\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>多输出目标\u003C\u002Ftd>\n   \u003Ctd>Console \u002F Debug \u002F Trace \u002F File \u002F AsyncFile \u002F Udp \u002F AdoNet 共 8 种 Appender，任意组合\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>完善的文件滚动\u003C\u002Ftd>\n   \u003Ctd>11 种文件滚动（大小 \u002F 分 \u002F 时 \u002F 天 \u002F 月 \u002F 年及组合）× 7 种目录滚动，支持过期清理\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>零分配渲染\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>LogEntry\u003C\u002Fcode> 值语义结构体 + \u003Ccode>ReusableDelegateWriter\u003C\u002Fcode> + \u003Ccode>ValueStringBuilder\u003C\u002Fcode>，热路径零 GC\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>异步批处理\u003C\u002Ftd>\n   \u003Ctd>基于 \u003Ccode>System.Threading.Channels\u003C\u002Fcode> 的有界队列（\u003Ccode>ProducerConsumerQueue\u003C\u002Fcode>），Drop \u002F Block 背压，优雅关闭\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>级别模型\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>Trace \u002F Debug \u002F Info \u002F Warn \u002F Error \u002F Fatal\u003C\u002Fcode> 六级，含 \u003Ccode>IsXxxEnabled\u003C\u002Fcode> 前置短路\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>彩色分级控制台\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>ConsoleAppender\u003C\u002Fcode> 可选 ANSI 着色（默认关闭），跨平台、多线程不串色\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>结构化日志\u003C\u002Ftd>\n   \u003Ctd>原生 \u003Ccode>EventId\u003C\u002Fcode> + \u003Ccode>Scope\u003C\u002Fcode>（\u003Ccode>ILog.BeginScope\u003C\u002Fcode>，\u003Ccode>AsyncLocal\u003C\u002Fcode>，\u003Ccode>using\u003C\u002Fcode> 嵌套 + \u003Ccode>await\u003C\u002Fcode> 流转）\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>源生成器\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>[Log]\u003C\u002Fcode>（注入 \u003Ccode>ILog\u003C\u002Fcode> 字段）+ \u003Ccode>[LoggerMessage]\u003C\u002Fcode>（强类型零装箱），双后端通吃 MiniLog 与 MEL\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>MEL 兼容\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>MiniLog.Extensions.Logging\u003C\u002Fcode> 提供 \u003Ccode>AddMiniLog()\u003C\u002Fcode>，可作为 MS Logging 的 Provider 接入\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>过滤器链\u003C\u002Ftd>\n   \u003Ctd>8 种 \u003Ccode>FilterOptions\u003C\u002Fcode>，三态判定 \u003Ccode>Deny \u002F Neutral \u002F Accept\u003C\u002Fcode>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Chr>\n\u003Ch2>二、快速开始\u003C\u002Fh2>\n\u003Ch3>2.1 安装\u003C\u002Fh3>\n\u003Cp>MiniLog 已发布到 NuGet，直接引用包即可。\u003Cstrong>源生成器\u003C\u002Fstrong> \u003Cstrong>\u003Ccode>MiniLog.Generators\u003C\u002Fcode>（含\u003C\u002Fstrong> \u003Cstrong>\u003Ccode>[Log]\u003C\u002Fcode>\u003C\u002Fstrong> \u003Cstrong>\u002F\u003C\u002Fstrong> \u003Cstrong>\u003Ccode>[LoggerMessage]\u003C\u002Fcode>\u003C\u002Fstrong> \u003Cstrong>生成与布局模式校验分析器）随包自动以 Analyzer 形式引入，无需单独安装。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 核心库（.NET 8.0 \u002F .NET 10.0 双目标框架）\ndotnet add package MiniLog\n\n# 可选：接入 ASP.NET Core \u002F Microsoft.Extensions.Logging 时再装此包\ndotnet add package MiniLog.Extensions.Logging\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>要求：.NET 8.0 或 .NET 10.0 SDK。\u003Cbr>\n   包 ID：\u003Ccode>MiniLog\u003C\u002Fcode>（核心库）、\u003Ccode>MiniLog.Extensions.Logging\u003C\u002Fcode>（MEL 适配器）。两者均为 MIT、零外部依赖。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>尚未发布或本地开发 \u002F 贡献时，可用源码引用或本地生成包：\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 方式 A：项目引用（含源生成器，自动以 Analyzer 引入）\ndotnet add reference ..\u002Fsrc\u002FMiniLog\u002FMiniLog.csproj\n\n# 方式 B：本地生成 NuGet 包后引用\ndotnet pack src\u002FMiniLog\u002FMiniLog.csproj -c Release   # 产物 bin\u002FRelease\u002FMiniLog.1.0.0.nupkg\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>2.2 静态门面（最简，5 行开始记录）\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>using MiniLog;\n\n\u002F\u002F 程序启动时调用一次：默认查找 log.config.xml，缺失时按 xml→json→ini 自动探测同名配置，\n\u002F\u002F 均无则回退到 Logs\u002FLog.txt\nLogManager.Initialize();\n\nvar log = LogManager.GetLogger&lt;Program&gt;();   \u002F\u002F Logger 名默认取类型简单名 \"Program\"\nlog.Info(\"应用启动\");\nlog.Warn(\"磁盘剩余空间偏低\");\n\n\u002F\u002F 程序退出前调用一次，确保异步 Appender 缓冲落盘\nLogManager.Shutdown();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>一个完整的控制台最小示例（\u003Ccode>Program.cs\u003C\u002Fcode>）：\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>using MiniLog;\n\nLogManager.Initialize();              \u002F\u002F 读取 log.config.xml（或同目录 xml\u002Fjson\u002Fini）\ntry\n{\n    var log = LogManager.GetLogger&lt;Program&gt;();\n    log.Info(\"应用启动\");\n    log.Error(\"出错了\", new Exception(\"演示异常\"));\n}\nfinally\n{\n    LogManager.Shutdown();            \u002F\u002F 优雅关闭，刷新异步文件缓冲\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>2.3 源生成器 \u003Ccode>[Log]\u003C\u002Fcode>（Lombok 风格，推荐）\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>[Log]                                   \u002F\u002F 编译期注入：private static readonly ILog log;\npublic partial class OrderService       \u002F\u002F 默认字段名 log；默认 Logger 名 = 简单类名 \"OrderService\"\n{\n    public void Process(int id) =&gt; log.Info(\"处理订单 \" + id);\n}\n\n\u002F\u002F 覆盖注入的 Logger 名（默认用类的简单名，不含命名空间）\n[Log(Name = \"MyApp.Order\")]\npublic partial class OrderService2 { \u002F* ... *\u002F }\n\n\u002F\u002F 逐类覆盖默认字段名（库默认已是 log，此处演示可改）\n[Log(FieldName = \"Logger\")]\npublic partial class OrderService3 { \u002F* ... *\u002F }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>默认注入字段名为 \u003Ccode>log\u003C\u002Fcode>（库新建无历史包袱，已从 \u003Ccode>Log\u003C\u002Fcode> 改为小写）；可用 \u003Ccode>[Log(FieldName=\"...\")]\u003C\u002Fcode> 逐类覆盖。\u003Ccode>[Log(Name=\"...\")]\u003C\u002Fcode> 可覆盖注入的 Logger 名，\u003Ccode>[LoggerMessage]\u003C\u002Fcode> 同样支持。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>2.4 源生成器 \u003Ccode>[LoggerMessage]\u003C\u002Fcode>（强类型、零装箱）\u003C\u002Fh3>\n\u003Cp>\u003Ccode>[LoggerMessage]\u003C\u002Fcode> 标记 \u003Ccode>partial\u003C\u002Fcode> 方法，生成器为其补全实现：入口先判定级别 \u003Ccode>IsXxxEnabled\u003C\u002Fcode>，级别关闭时零分配直接返回；热路径参数经结构化参数袋零装箱直写，兼顾性能与强类型。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>[Log]                                       \u002F\u002F 注入 log 字段；本类 [LoggerMessage] 方法自动复用它\npublic partial class OrderService\n{\n    \u002F\u002F 字段模式：无 ILog 首参，生成的实现直接使用类的 log 字段\n    [LoggerMessage(LogLevel.Info, \"处理订单 {Id} 金额 {Amount}\")]\n    public partial void LogOrderProcessed(int id, decimal amount);\n\n    \u002F\u002F 显式 ILog 首参模式：按传入的 ILog 派发（可用于 MEL 的 ILogger）\n    [LoggerMessage(LogLevel.Error, \"保存失败 {Id}\")]\n    public partial void LogSaveFailed(ILog log, int id);\n}\n\n\u002F\u002F 调用处（与手写日志等价，但无装箱、带级别短路）\nvar svc = new OrderService();\nsvc.LogOrderProcessed(1001, 29.9m);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>级别可省略，由方法名推断（\u003Ccode>LogInfo\u003C\u002Fcode>\u002F\u003Ccode>LogWarn\u003C\u002Fcode>\u002F\u003Ccode>LogError\u003C\u002Fcode>…）；也可 \u003Ccode>[LoggerMessage(LogLevel.Warn, \"...\")]\u003C\u002Fcode> 显式指定。\u003Ccode>[LoggerMessage]\u003C\u002Fcode> 既可单独使用（生成器自动注入 log 字段），也可与 \u003Ccode>[Log]\u003C\u002Fcode> 同用（复用已注入字段）。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>2.5 配置文件 + Fluent Builder\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>var mgr = LogManager.CreateLogManager(b =&gt; b\n    .UseConsoleAppender()\n    .UseFileAppender(\"file\", new FileAppenderOptions\n    {\n        FileDirectory = \"Logs\", FileName = \"app\", Extension = \".log\",\n        RollingMode = FileRollingMode.DailyAndSize, ExpiredDays = 30,\n    })\n    .UseRoot(LogLevel.Warn, \"console\")\n    .UseLogger(\"MyApp.Data\", LogLevel.Info, \"console\", \"file\"));\nLogManager.SetLogManager(mgr);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>更多用法（ILog 接口速查、结构化日志、彩色控制台、MEL 集成、源生成器）见 \u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002Fdocs\u002FMiniLog%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C.md\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">MiniLog 使用手册\u003C\u002Fa>。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>2.6 从源码构建与测试\u003C\u002Fh3>\n\u003Cp>仓库\u003Cstrong>无\u003C\u002Fstrong> \u003Cstrong>\u003Ccode>.sln\u003C\u002Fcode>\u003C\u002Fstrong> \u003Cstrong>解决方案文件\u003C\u002Fstrong>，直接按项目构建（目标 .NET 8.0 \u002F .NET 10.0 双 TFM）：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>dotnet build src\u002FMiniLog\u002FMiniLog.csproj -c Release\ndotnet build src\u002FMiniLog.Generators\u002FMiniLog.Generators.csproj -c Release\ndotnet test  test\u002FMiniLog.Tests\u002FMiniLog.Tests.csproj -c Release\ndotnet test  test\u002FMiniLog.Extensions.Logging.Tests\u002FMiniLog.Extensions.Logging.Tests.csproj -c Release\ndotnet pack  src\u002FMiniLog\u002FMiniLog.csproj -c Release   # 产出 NuGet 包\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>双门禁（提交门槛）\u003C\u002Fstrong>：\u003Ccode>MiniLog\u003C\u002Fcode> \u002F \u003Ccode>MiniLog.Generators\u003C\u002Fcode> 开启 \u003Ccode>-warnaserror\u003C\u002Fcode>，Debug 与 Release 下 net8.0 \u002F net10.0 必须 \u003Cstrong>0 警告 0 错误\u003C\u002Fstrong>；两套测试全绿才算闭环。贡献前请本地跑齐上述命令。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>三、与其他开源日志库对比\u003C\u002Fh2>\n\u003Cp>MiniLog 与 log4net \u002F NLog \u002F Serilog \u002F MS.Extensions.Logging 定位有本质差异：它保留传统派发模型（Logger → Appender → Layout），但在底层用零分配渲染与源生成器实现数量级性能领先。\u003C\u002Fp>\n\u003Ch3>3.1 能力矩阵（主流 5 库）\u003C\u002Fh3>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>维度\u003C\u002Fth>\n   \u003Cth>\u003Cstrong>MiniLog\u003C\u002Fstrong>\u003C\u002Fth>\n   \u003Cth>log4net\u003C\u002Fth>\n   \u003Cth>NLog\u003C\u002Fth>\n   \u003Cth>Serilog\u003C\u002Fth>\n   \u003Cth>MS.Extensions.Logging\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>外部依赖\u003C\u002Ftd>\n   \u003Ctd>\u003Cstrong>无\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>无\u003C\u002Ftd>\n   \u003Ctd>无\u003C\u002Ftd>\n   \u003Ctd>无\u003C\u002Ftd>\n   \u003Ctd>无（抽象层）\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>配置方式\u003C\u002Ftd>\n   \u003Ctd>XML \u002F JSON \u002F INI \u002F Builder\u003C\u002Ftd>\n   \u003Ctd>XML \u002F 代码\u003C\u002Ftd>\n   \u003Ctd>XML \u002F JSON \u002F 代码\u003C\u002Ftd>\n   \u003Ctd>JSON \u002F 代码 \u002F C#\u003C\u002Ftd>\n   \u003Ctd>appsettings \u002F 代码\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>Appender \u002F 输出目标\u003C\u002Ftd>\n   \u003Ctd>8 种\u003C\u002Ftd>\n   \u003Ctd>20+ 种\u003C\u002Ftd>\n   \u003Ctd>80+ Targets\u003C\u002Ftd>\n   \u003Ctd>Sink 生态（数百）\u003C\u002Ftd>\n   \u003Ctd>内置 + 第三方 Provider\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>零分配渲染\u003C\u002Ftd>\n   \u003Ctd>\u003Cstrong>是（热路径）\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>否\u003C\u002Ftd>\n   \u003Ctd>部分\u003C\u002Ftd>\n   \u003Ctd>否\u003C\u002Ftd>\n   \u003Ctd>取决于 Provider\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>源生成器\u003C\u002Ftd>\n   \u003Ctd>\u003Cstrong>内置（双后端）\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>无\u003C\u002Ftd>\n   \u003Ctd>无\u003C\u002Ftd>\n   \u003Ctd>无（用 MEL LoggerMessage）\u003C\u002Ftd>\n   \u003Ctd>\u003Cstrong>LoggerMessage（官方）\u003C\u002Fstrong>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>结构化日志\u003C\u002Ftd>\n   \u003Ctd>EventId + Scope（值语义）\u003C\u002Ftd>\n   \u003Ctd>弱\u003C\u002Ftd>\n   \u003Ctd>支持（Layout）\u003C\u002Ftd>\n   \u003Ctd>\u003Cstrong>一等公民\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>一等公民\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>彩色控制台\u003C\u002Ftd>\n   \u003Ctd>ANSI（可选，默认关）\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>ColoredConsoleAppender\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>ColoredConsole\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>控制台 Sink 主题\u003C\u002Ftd>\n   \u003Ctd>控制台 Provider 支持\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>成熟度 \u002F 生态\u003C\u002Ftd>\n   \u003Ctd>预览期\u003C\u002Ftd>\n   \u003Ctd>\u003Cstrong>极高\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>高\u003C\u002Ftd>\n   \u003Ctd>高\u003C\u002Ftd>\n   \u003Ctd>\u003Cstrong>官方标准\u003C\u002Fstrong>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3>3.2 性能定位\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>固定消息：MiniLog(26.8µs) &lt;&lt; MS(102µs) &lt;&lt; Serilog(869µs) &lt;&lt; NLog(16.5ms) ≈ log4net(17.6ms)\n异步文件：MiniLog(98µs) &lt;&lt; NLog(1.6ms) ≈ MS(1.8ms) &lt;&lt; log4net(2.4ms) &lt;&lt; Serilog(9.8ms)\n级别关闭：MiniLog源生成(7.5µs\u002F0B) &lt; MS LoggerMessage(11.5µs\u002F0B) &lt;&lt; MS 原生(仍分配 640KB)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cul>\n \u003Cli>\u003Cp>\u003Cstrong>vs log4net \u002F NLog\u003C\u002Fstrong>：传统派发模型但非文件模式快 600×+，零分配，现代 API。\u003C\u002Fp>\u003C\u002Fli>\n \u003Cli>\u003Cp>\u003Cstrong>vs Serilog\u003C\u002Fstrong>：Serilog 结构化日志与 Sink 生态最丰富；MiniLog 在性能与分配上显著占优。\u003C\u002Fp>\u003C\u002Fli>\n \u003Cli>\u003Cp>\u003Cstrong>vs MS.Extensions.Logging\u003C\u002Fstrong>：真实负载下更快且零分配语义打平；MiniLog 通过 \u003Ccode>MiniLog.Extensions.Logging\u003C\u002Fcode> 直接作为 MS Provider 接入，兼得两者。\u003C\u002Fp>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cblockquote>\n \u003Cp>完整能力矩阵、性能三段排名与选型建议见 \u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002Fdocs\u002FMiniLog%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C.md#%E5%8D%81%E4%B8%89%E4%B8%8E%E5%85%B6%E4%BB%96%E5%BC%80%E6%BA%90%E6%97%A5%E5%BF%97%E5%BA%93%E5%AF%B9%E6%AF%94\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">使用手册·对比章节\u003C\u002Fa>。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Chr>\n\u003Ch2>四、配置\u003C\u002Fh2>\n\u003Cp>MiniLog 支持 \u003Cstrong>XML \u002F JSON \u002F INI\u003C\u002Fstrong> 三种格式 + \u003Cstrong>Fluent Builder\u003C\u002Fstrong>。默认查找 \u003Ccode>AppDomain.CurrentDomain.BaseDirectory\u002Flog.config.xml\u003C\u002Fcode>，缺失时按 xml→json→ini 优先级自动探测同目录同名配置，均无则回退到 \u003Ccode>Logs\u002FLog.txt\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cp>最简 XML 示例：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n&lt;log SupportsExpiredFileDetector=\"true\" ExpiredFileCheckInterval=\"30\"&gt;\n  &lt;Appenders&gt;\n    &lt;Appender Type=\"Console\" Name=\"console\" Level=\"Info\" \u002F&gt;\n    &lt;Appender Type=\"File\" Name=\"file\" Level=\"Debug\"&gt;\n      &lt;File FileDirectory=\"Logs\" FileName=\"app\" Extension=\".log\"\n            RollingMode=\"DailyAndSize\" MaxFileSize=\"50\" ExpiredDays=\"30\" \u002F&gt;\n    &lt;\u002FAppender&gt;\n  &lt;\u002FAppenders&gt;\n  &lt;Loggers&gt;\n    &lt;Logger Name=\"MyApp.Data\" Level=\"Debug\"&gt;\n      &lt;Appenders&gt;&lt;Appender&gt;file&lt;\u002FAppender&gt;&lt;\u002FAppenders&gt;\n    &lt;\u002FLogger&gt;\n  &lt;\u002FLoggers&gt;\n  &lt;Root Level=\"Warn\"&gt;\n    &lt;Appenders&gt;&lt;Appender&gt;console&lt;\u002FAppender&gt;&lt;\u002FAppenders&gt;\n  &lt;\u002FRoot&gt;\n&lt;\u002Flog&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>常用占位符：\u003Ccode>%timestamp\u003C\u002Fcode>\u002F\u003Ccode>%thread\u003C\u002Fcode>\u002F\u003Ccode>%level\u003C\u002Fcode>\u002F\u003Ccode>%logger\u003C\u002Fcode>\u002F\u003Ccode>%message\u003C\u002Fcode>\u002F\u003Ccode>%exception\u003C\u002Fcode>\u002F\u003Ccode>%newline\u003C\u002Fcode>\u002F\u003Ccode>%appdomain\u003C\u002Fcode>\u002F\u003Ccode>%username\u003C\u002Fcode>\u002F\u003Ccode>%identity\u003C\u002Fcode>\u002F\u003Ccode>%file\u003C\u002Fcode>\u002F\u003Ccode>%line\u003C\u002Fcode>\u002F\u003Ccode>%method\u003C\u002Fcode>\u002F\u003Ccode>%location\u003C\u002Fcode>\u002F\u003Ccode>%eventid\u003C\u002Fcode>\u002F\u003Ccode>%scope\u003C\u002Fcode>\u002F\u003Ccode>%property\u003C\u002Fcode>\u002F\u003Ccode>%stacktrace\u003C\u002Fcode>（共 22 个）。\u003C\u002Fp>\n\u003Cblockquote>\n \u003Cp>\u003Cstrong>完整配置参考\u003C\u002Fstrong>（加载机制、三格式选型、顶层选项、Appender 全属性、File \u002F AdoNet 选项、Logger·Root、滚动模式、三格式完整示例、Fluent Builder、Schema 验证、已知问题）见 \u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002Fdocs\u002FMiniLog%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C.md#%E4%BA%94%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">MiniLog 使用手册·配置详解\u003C\u002Fa> 与 \u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002FCONFIGURATION.md\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">CONFIGURATION.md\u003C\u002Fa>。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Chr>\n\u003Ch2>五、Appenders 输出目标\u003C\u002Fh2>\n\u003Cp>共 8 种，均线程安全：\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>类型\u003C\u002Fth>\n   \u003Cth>实现\u003C\u002Fth>\n   \u003Cth>说明\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>None\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>NoneAppender\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>丢弃所有日志。用于显式关闭通道或零开销基准。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>Console\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>ConsoleAppender\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>输出到 \u003Ccode>Console.Out\u003C\u002Fcode>；可选 ANSI 彩色分级。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>Debug\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>DebugAppender\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>输出到 \u003Ccode>System.Diagnostics.Debugger.Log\u003C\u002Fcode>。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>Trace\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>TraceAppender\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>输出到 \u003Ccode>System.Diagnostics.Trace.Listeners\u003C\u002Fcode>。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>File\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>FileAppender\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>同步文件追加，内部 \u003Ccode>lock\u003C\u002Fcode> 保证写入与滚动安全。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>AsyncFile\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>AsyncFileAppender\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>基于 \u003Ccode>Channels\u003C\u002Fcode> 异步写入，调用方不阻塞；队列满可能丢弃（设计权衡）。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>Udp\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>UdpAppender\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>经 \u003Ccode>UdpClient\u003C\u002Fcode> 发送渲染文本到远程端点，超长消息截断。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>AdoNet\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>AdoNetAppender\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>参数化 SQL 写关系型数据库；支持零分配直传与异步批量。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cblockquote>\n \u003Cp>选型：低并发用 \u003Ccode>File\u003C\u002Fcode>，高并发用 \u003Ccode>AsyncFile\u003C\u002Fcode>。完整 8 种配置与 AdoNet 异步参数见 \u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002Fdocs\u002FMiniLog%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C.md#%E5%85%ADappenders-%E8%BE%93%E5%87%BA%E7%9B%AE%E6%A0%87\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">使用手册·Appenders\u003C\u002Fa>。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Chr>\n\u003Ch2>六、性能定位\u003C\u002Fh2>\n\u003Ch3>6.1 基准快照（.NET 8.0，BenchmarkDotNet）\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>固定消息（10K 次循环总耗时）：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>库\u003C\u002Fth>\n   \u003Cth>Mean\u003C\u002Fth>\n   \u003Cth>分配\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>\u003Cstrong>MiniLog（无输出短路）\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>\u003Cstrong>26.83 µs\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>\u003Cstrong>0 B\u003C\u002Fstrong>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>MS Logging（未挂 Provider，纯 no-op）\u003C\u002Ftd>\n   \u003Ctd>102.52 µs\u003C\u002Ftd>\n   \u003Ctd>0 B\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>Serilog\u003C\u002Ftd>\n   \u003Ctd>868.70 µs\u003C\u002Ftd>\n   \u003Ctd>1.6 MB\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>NLog\u003C\u002Ftd>\n   \u003Ctd>16,548.81 µs\u003C\u002Ftd>\n   \u003Ctd>1.2 MB\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>log4net\u003C\u002Ftd>\n   \u003Ctd>17,561.30 µs\u003C\u002Ftd>\n   \u003Ctd>2.0 MB\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>异步文件（1K 条）：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>库\u003C\u002Fth>\n   \u003Cth>Mean\u003C\u002Fth>\n   \u003Cth>分配\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>\u003Cstrong>MiniLog-AsyncFile\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>\u003Cstrong>97.52 µs\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>\u003Cstrong>94 KB\u003C\u002Fstrong>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>NLog\u003C\u002Ftd>\n   \u003Ctd>1,611.5 µs\u003C\u002Ftd>\n   \u003Ctd>171 KB\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>MS Logging\u003C\u002Ftd>\n   \u003Ctd>1,781.8 µs\u003C\u002Ftd>\n   \u003Ctd>241 KB\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>log4net\u003C\u002Ftd>\n   \u003Ctd>2,360.8 µs\u003C\u002Ftd>\n   \u003Ctd>350 KB\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>Serilog\u003C\u002Ftd>\n   \u003Ctd>9,796.4 µs\u003C\u002Ftd>\n   \u003Ctd>491 KB\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>源生成器级别关闭（10K 次）：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>方式\u003C\u002Fth>\n   \u003Cth>Mean\u003C\u002Fth>\n   \u003Cth>分配\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>\u003Cstrong>MiniLog 源生成\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>\u003Cstrong>7.49 µs\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>\u003Cstrong>0 B\u003C\u002Fstrong>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>MS LoggerMessage\u003C\u002Ftd>\n   \u003Ctd>11.53 µs\u003C\u002Ftd>\n   \u003Ctd>0 B\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>MiniLog 原生 API\u003C\u002Ftd>\n   \u003Ctd>35.84 µs\u003C\u002Ftd>\n   \u003Ctd>0 B\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>MS 原生 \u003Ccode>LogInformation(params)\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>232.93 µs\u003C\u002Ftd>\n   \u003Ctd>640 KB\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cblockquote>\n \u003Cp>横向基准中 MS Logging 未挂载任何 Provider，\u003Ccode>Log()\u003C\u002Fcode> 在 \u003Ccode>IsEnabled\u003C\u002Fcode> 即短路为纯 no-op（102µs 是「什么都不做」的代价）。真实项目 MS 必挂 Provider，开销会上升。详细设计与并发\u002F过滤基准见 \u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002Fdocs\u002FMiniLog%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C.md#%E5%8D%81%E4%BA%8C%E6%80%A7%E8%83%BD%E8%AE%BE%E8%AE%A1\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">使用手册·性能设计\u003C\u002Fa> 与 \u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002FBENCHMARK_REPORT.md\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">BENCHMARK_REPORT.md\u003C\u002Fa>。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>6.2 零分配黄金路径\u003C\u002Fh3>\n\u003Cp>要让日志调用达成热路径零堆分配（对应基准：固定消息 42µs\u002F万条零分配、参数袋 Span 物化 8.8µs\u002F零分配、UDP 新 26ns\u002F零分配；并发 40 万消息 16\u002F18 零 GC），遵循：\u003C\u002Fp>\n\u003Col>\n \u003Cli>\u003Cstrong>用结构化 API 代替字符串插值\u003C\u002Fstrong>：\u003Ccode>logger.Log(new LogEntry { ... })\u003C\u002Fcode> 或源生成器 \u003Ccode>Log&lt;TBag&gt;\u003C\u002Fcode>（编译期 \u003Ccode>FormatTo\u003C\u002Fcode> 零分配直写）；避免 \u003Ccode>logger.Info($\"User {id}\")\u003C\u002Fcode>（每次分配插值字符串，基准 560KB\u002F万条）。\u003C\u002Fli>\n \u003Cli>\u003Cstrong>渲染物化走 Span 直写\u003C\u002Fstrong>：Appender 内部默认 \u003Ccode>WriteToAndClear(TextWriter)\u003C\u002Fcode> 直写（零分配）；仅确需字符串时才调 \u003Ccode>GetStringAndClear\u003C\u002Fcode>（基准 96KB\u002F千次）。\u003C\u002Fli>\n \u003Cli>\u003Cstrong>结构化字段用\u003C\u002Fstrong> \u003Cstrong>\u003Ccode>%property\u003C\u002Fcode>\u003C\u002Fstrong>：经 \u003Ccode>LogEntry.Properties[\"k\"] = v\u003C\u002Fcode> 设置，\u003Ccode>%property{k}\u003C\u002Fcode> 渲染；\u003Ccode>PropertyCount == 0\u003C\u002Fcode> 短路零开销。\u003C\u002Fli>\n \u003Cli>\u003Cstrong>高吞吐降载用采样\u003C\u002Fstrong>：配置 \u003Ccode>SamplingFilterOptions\u003C\u002Fcode>，无锁零分配按比例丢弃。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>完整四层基准（热方法 \u002F 端到端 \u002F 并发零分配 \u002F 解析）与零回退论证见 \u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002FBENCHMARK_REPORT.md\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">BENCHMARK_REPORT.md\u003C\u002Fa>。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>布局模式校验器（编译期 LLG 诊断）\u003C\u002Fh2>\n\u003Cp>MiniLog 内置一个 Roslyn 分析器（\u003Ccode>MiniLog.Generators\u003C\u002Fcode>），在\u003Cstrong>编译期\u003C\u002Fstrong>校验赋值给 \u003Ccode>AppenderOptions.Pattern\u003C\u002Fcode> \u002F \u003Ccode>AdoNetParameter.Layout\u003C\u002Fcode>（含 \u003Ccode>WithPattern(...)\u003C\u002Fcode> \u002F \u003Ccode>WithLayout(...)\u003C\u002Fcode> 入参、常量折叠与插值字面段）的布局模式串，把 \u003Ccode>%token\u003C\u002Fcode> 拼写 \u002F 格式错误拦在构建前，而非运行时解析失败。经 NuGet 包引入时分析器自动随包进入 \u003Ccode>analyzers\u002Fdotnet\u002Fcs\u003C\u002Fcode>，消费方编译期即得校验；配置文件（XML \u002F JSON \u002F INI）字面量则由 \u003Ccode>ConfigurationBinder\u003C\u002Fcode> 运行期探针以 \u003Ccode>Trace\u003C\u002Fcode> 警告兜底。\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>诊断\u003C\u002Fth>\n   \u003Cth>触发条件\u003C\u002Fth>\n   \u003Cth>示例\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>LLG0002\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>未知占位符（附最近邻建议）\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>%levl\u003C\u002Fcode> → 是否指 \u003Ccode>%level\u003C\u002Fcode>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>LLG0003\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>未闭合的 \u003Ccode>{\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>%date{yyyy-MM-dd\u003C\u002Fcode>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>LLG0004\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>空选项 \u003Ccode>{}\u003C\u002Fcode> \u002F \u003Ccode>{ }\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>%property{}\u003C\u002Fcode>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>LLG0005\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>已知令牌带不应有的选项\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>%level{critical}\u003C\u002Fcode>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>LLG0006\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>%date\u003C\u002Fcode> \u002F \u003Ccode>%timestamp\u003C\u002Fcode> 选项保留字拼写错误\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>%date{ISO860}\u003C\u002Fcode> → \u003Ccode>ISO8601\u003C\u002Fcode>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>保留字（\u003Ccode>LLG0006\u003C\u002Fcode> 建议集）：\u003Ccode>ISO8601\u003C\u002Fcode> \u002F \u003Ccode>DATE\u003C\u002Fcode> \u002F \u003Ccode>ABSOLUTE\u003C\u002Fcode> \u002F \u003Ccode>COMPACT\u003C\u002Fcode>；精确匹配或任意 .NET 格式（如 \u003Ccode>yyyy-MM-dd\u003C\u002Fcode>）合法、不触发。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F\u002F 编译期即报错，而非运行时才发现布局串写错\nnew AppenderOptions { Pattern = \"%levl %logger\" };        \u002F\u002F ⚠ LLG0002 未知 'levl'（是否指 'level'?）\nnew AppenderOptions().WithPattern(\"%date{yyyy-MM-dd\");      \u002F\u002F ⚠ LLG0003 未闭合\nnew AppenderOptions { Pattern = \"%property{}\" };            \u002F\u002F ⚠ LLG0004 空选项\nnew AppenderOptions { Pattern = \"%level{x}\" };              \u002F\u002F ⚠ LLG0005 'level' 不接受选项\nnew AppenderOptions { Pattern = \"%date{ISO860}\" };          \u002F\u002F ⚠ LLG0006 疑似 'ISO8601'\n\n\u002F\u002F 配置文件（经 NuGet 分析的消费方亦生效，IDE 实时波浪线 + 构建警告）\n&lt;Appender Pattern=\"%levl %level\" \u002F&gt;                        \u002F\u002F ⚠ 未知占位符 'levl'（是否指 'level'?）\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>有意不做（编译期不可判定）：非常量动态值（变量、含非 const 孔的插值）、\u003Ccode>%date{非法格式}\u003C\u002Fcode> 格式合法性、\u003Ccode>%property{不存在的键}\u003C\u002Fcode> 键存在性 —— 交由运行时解析兜底。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Chr>\n\u003Ch2>七、文档导航\u003C\u002Fh2>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>文档\u003C\u002Fth>\n   \u003Cth>内容\u003C\u002Fth>\n   \u003Cth>\u003Cbr>\u003C\u002Fth>\n   \u003Cth>\u003Cbr>\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002Fdocs\u002FMiniLog%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C.md\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">MiniLog 使用手册（中文）\u003C\u002Fa>\u003C\u002Ftd>\n   \u003Ctd>核心特性 \u002F 安装 \u002F 快速开始 \u002F 核心概念 \u002F \u003Cstrong>配置详解\u003C\u002Fstrong> \u002F Appenders \u002F 过滤器 \u002F 彩色控制台 \u002F 结构化日志 \u002F 源生成器 \u002F MEL 集成 \u002F 性能设计 \u002F \u003Cstrong>与其他开源库对比\u003C\u002Fstrong> \u002F log4net 迁移 \u002F 许可证\u003C\u002Ftd>\n   \u003Ctd>\u003Cbr>\u003C\u002Ftd>\n   \u003Ctd>\u003Cbr>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002FCONFIGURATION.md\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">配置参考\u003C\u002Fa>\u003C\u002Ftd>\n   \u003Ctd>XML \u002F JSON \u002F INI 全部配置项、加载机制、Fluent API、Schema 验证、15 条已知问题\u003C\u002Ftd>\n   \u003Ctd>\u003Cbr>\u003C\u002Ftd>\n   \u003Ctd>\u003Cbr>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002Fdocs\u002FMEL%E9%9B%86%E6%88%90%E6%8C%87%E5%8D%97.md\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">MEL 集成指南\u003C\u002Fa>\u003C\u002Ftd>\n   \u003Ctd>与 Microsoft.Extensions.Logging 集成的权威深度文档：注册 API 全景 \u002F 两种生命周期模型 \u002F 级别·名称·结构化·Scope 映射 \u002F IConfiguration 桥接原理 \u002F 热重载 \u002F 排错\u003C\u002Ftd>\n   \u003Ctd>\u003Cbr>\u003C\u002Ftd>\n   \u003Ctd>\u003Cbr>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002FBENCHMARK_REPORT.md\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">基准报告\u003C\u002Fa>\u003C\u002Ftd>\n   \u003Ctd>BenchmarkDotNet 性能数据\u003C\u002Ftd>\n   \u003Ctd>\u003Cbr>\u003C\u002Ftd>\n   \u003Ctd>\u003Cbr>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002Fdocs\u002FDIAGNOSTICS.md\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">编译期诊断码总表\u003C\u002Fa>\u003C\u002Ftd>\n   \u003Ctd>LLG0001–LLG0015 目录 \u002F 配置文件分析器触发范围 \u002F MEL 路径边界\u003C\u002Ftd>\n   \u003Ctd>\u003Cbr>\u003C\u002Ftd>\n   \u003Ctd>\u003Cbr>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002FCHANGELOG.md\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">变更日志\u003C\u002Fa>\u003C\u002Ftd>\n   \u003Ctd>版本变更记录（1.0.0 GA 起，按需补充）\u003C\u002Ftd>\n   \u003Ctd>\u003Cbr>\u003C\u002Ftd>\n   \u003Ctd>\u003Cbr>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Chr>\n\u003Ch2>八、许可证\u003C\u002Fh2>\n\u003Cp>MIT —— 详见 \u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog\u002Fblob\u002Fmaster\u002FLICENSE\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">LICENSE\u003C\u002Fa>（仓库根目录）。\u003C\u002Fp>","MiniLog 轻量、高性能的 .NET 日志组件库，零外部依赖。API 形态借鉴 log4net \u002F NLog 的派发模型（Logger → Appender → Layout），但在底层采用结构体日志条目、零分配渲染与源生成器，定位为「现代、低 GC 压力、可替代 MS Logging 的高性能日志框架」。 核心技术亮点： 零分配渲染 —— LogEntry 值语义结构体 + ReusableDelegateWriter + ValueStringBuilder（栈缓冲 \u002F ArrayPool），热路径零 GC 零装箱派发 —— 源生成器经 ILogArgumentBag 泛型参数袋把结构化参数穿过整条派发链，启用路径不装箱 ANSI 彩色分级控制台 —— 可选、EnableColors 默认关、跨平台、不依赖 Console 全局颜色状态 源生成器双后端 —— [Log]（注入 ILog 字段）+ [LoggerMessage]（强类型零装箱），一份声明通吃 MiniLog 与 Microsoft.Extensions.Logging 8 种 Appender + 8 种过滤器 + 11×7 文件\u002F目录滚动 版本: 1.0.0（GA）| 目标框架: .NET 8.0 \u002F .NET 10.0 | 许可证: MIT 状态：首个正式稳定版（GA）。可从源码构建或引用本地包使用；包名 MiniLog 经核查在 nuget.org 可用、无冲突。 源码仓库：https:\u002F\u002Fgitee.com\u002Fnetcasewqs\u002FMiniLog 设计渊源 MiniLog 并非从零开始设计，其内核吸收了作者在前公司连续运行 10 余年的日志组件经验。该组件在大数据吞吐场景下，内存与 CPU 占用均低于同期主流开源方案。其滚动策略可在目录、文件、时间维度上叠加容量上限灵活组合，运维友好。当错误发生时，仅凭年、月、日、时即可精确定位对应历史日志，排障效率显著提升。MiniLog 将这些经过产线长期验证的设计理念，以零分配、零依赖的现代 .NET 实现重新落地。 一、特性一览 特性 说明 零外部依赖 纯 .NET 实现，不引入任何第三方包 多格式配置 XML \u002F JSON \u002F INI 三种文件 + Fluent Builder；XML 带 XSD、JSON 带 JSON Schema，IDE 智能提示 多输出目标 Console \u002F Debug \u002F Trace \u002F File \u002F AsyncFile \u002F Udp \u002F AdoNet 共 8 种 Appender，任意组合 完善的文件滚动 11 种文件滚动（大小 \u002F 分 \u002F 时 \u002F 天 \u002F 月 \u002F 年及组合）× 7 种目录滚动，支持过期清理 零分配渲染 LogEntry 值语义结构体 + ReusableDelegateWriter + ValueStringBuilder，热路径零 GC 异步批处理 基于 System.Threading.Channels 的有界队列（ProducerConsumerQueue），Drop \u002F Block 背压，优雅关闭 级别模型 Trace \u002F Debug \u002F Info \u002F Warn \u002F Error \u002F Fatal 六级，含 IsXxxEnabled 前置短路 彩色分级控制台 ConsoleAppender 可选 ANSI 着色（默认关闭），跨平台、多线程不串色 结构化日志 原生 EventId + Scope（ILog.BeginScope，AsyncLocal，using 嵌套 + await 流转） 源生成器 [Log]（注入 ILog 字段）+ [LoggerMessage]（强类型零装箱），双后端通吃 MiniLog 与 MEL MEL 兼容 MiniLog.Extensions.Logging 提供 AddMiniLog()，可作为 MS Logging 的 Provider 接入 过滤器链 8 种 FilterOptions，三态判定 Deny \u002F Neutral \u002F Accept 二、快速开始 2.1 安装 MiniLog 已发布到 NuGet，直接引用包即可。源生成器 MiniLog.Generators（含 [Log] \u002F [LoggerMessage] 生成与布局模式校验分析器）随包自动以 Analyzer 形式引入，无需单独安装。 # 核心库（.NET 8.0 \u002F .NET 10.0 双目标框架） dotnet add package MiniLog # 可选：接入 ASP.NET Core \u002F Microsoft.Extensions.Logging 时再装此包 dotnet add package MiniLog.Extensions.Logging 要求：.NET 8.0 或 .NET 10.0 SDK。 包 ID：MiniLog（核心库）、MiniLog.Extensions.Logging（MEL 适配器）。两者均为 MIT、零外部依赖。 尚未发布或本地开发 \u002F 贡献时，可用源码引用或本地生成包： # 方式 A：项目引用（含源生成器，自动以 Analyzer 引入） dotnet add reference ..\u002Fsrc\u002FMiniLog\u002FMiniLog.csproj # 方式 B：本地生成 NuGet 包后引用 dotnet pack src\u002FMiniLog\u002FMiniLog.csproj -c Release # 产物 bin\u002FRelease\u002FMiniLog.1.0.0.nupkg 2.2 静态门面（最简，5 行开始记录） using MiniLog; \u002F\u002F 程序启动时调用一次：默认查找 log.config.xml，缺失时按 xml→json→ini 自动探测同名配置， \u002F\u002F 均无则回退到 Logs\u002FLog.txt LogManager.Initialize(); var log = LogManager.GetLogger\u003CProgram>(); \u002F\u002F Logger 名默认取类型简单名 \"Program\" log.Info(\"应用启动\"); log.Warn(\"磁盘剩余空间偏低\"); \u002F\u002F 程序退出前调用一次，确保异步 Appender 缓冲落盘 LogManager.Shutdown(); 一个完整的控制台最小示例（Program.cs）： using MiniLog; LogManager.Initialize(); \u002F\u002F 读取 log.config.xml（或同目录 xml\u002Fjson\u002Fini） try { var log = LogManager.GetLogger\u003CProgram>(); log.Info(\"应用启动\"); log.Error(\"出错了\", new Exception(\"演示异常\")); } finally { LogManager.Shutdown(); \u002F\u002F 优雅关闭，刷新异步文件缓冲 } 2.3 源生成器 [Log]（Lombok 风格，推荐） [Log] \u002F\u002F 编译期注入：private static readonly ILog log; public partial class OrderService \u002F\u002F 默认字段名 log；默认 Logger 名 = 简单类名 \"OrderService\" { public void Process(int id) => log.Info(\"处理订单 \" + id); } \u002F\u002F 覆盖注入的 Logger 名（默认用类的简单名，不含命名空间） [Log(Name = \"MyApp.Order\")] public partial class OrderService2 { \u002F* ... *\u002F } \u002F\u002F 逐类覆盖默认字段名（库默认已是 log，此处演示可改） [Log(FieldName = \"Logger\")] public partial class OrderService3 { \u002F* ... *\u002F } 默认注入字段名为 log（库新建无历史包袱，已从 Log 改为小写）；可用 [Log(FieldName=\"...\")] 逐类覆盖。[Log(Name=\"...\")] 可覆盖注入的 Logger 名，[LoggerMessage] 同样支持。 2.4 源生成器 [LoggerMessage]（强类型、零装箱） [LoggerMessage] 标记 partial 方法，生成器为其补全实现：入口先判定级别 IsXxxEnabled，级别关闭时零分配直接返回；热路径参数经结构化参数袋零装箱直写，兼顾性能与强类型。 [Log] \u002F\u002F 注入 log 字段；本类 [LoggerMessage] 方法自动复用它 public partial class OrderService { \u002F\u002F 字段模式：无 ILog 首参，生成的实现直接使用类的 log 字段 [LoggerMessage(LogLevel.Info, \"处理订单 {Id} 金额 {Amount}\")] public partial void LogOrderProcessed(int id, decimal amount); \u002F\u002F 显式 ILog 首参模式：按传入的 ILog 派发（可用于 MEL 的 ILogger） [LoggerMessage(LogLevel.Error, \"保存失败 {Id}\")] public partial void LogSaveFailed(ILog log, int id); } \u002F\u002F 调用处（与手写日志等价，但无装箱、带级别短路） var svc = new OrderService(); svc.LogOrderProcessed(1001, 29.9m); 级别可省略，由方法名推断（LogInfo\u002FLogWarn\u002FLogError…）；也可 [LoggerMessage(LogLevel.Warn, \"...\")] 显式指定。[LoggerMessage] 既可单独使用（生成器自动注入 log 字段），也可与 [Log] 同用（复用已注入字段）。 2.5 配置文件 + Fluent Builder var mgr = LogManager.CreateLogManager(b => b .UseConsoleAppender() .UseFileAppender(\"file\", new FileAppenderOptions { FileDirectory = \"Logs\", FileName = \"app\", Extension = \".log\", RollingMode = FileRollingMode.DailyAndSize, ExpiredDays = 30, }) .UseRoot(LogLevel.Warn, \"console\") .UseLogger(\"MyApp.Data\", LogLevel.Info, \"console\", \"file\")); LogManager.SetLogManager(mgr); 更多用法（ILog 接口速查、结构化日志、彩色控制台、MEL 集成、源生成器）见 MiniLog 使用手册。 2.6 从源码构建与测试 仓库无 .sln 解决方案文件，直接按项目构建（目标 .NET 8.0 \u002F .NET 10.0 双 TFM）： dotnet build src\u002FMiniLog\u002FMiniLog.csproj -c Release dotnet build src\u002FMiniLog.Generators\u002FMiniLog.Generators.csproj -c Release dotnet test test\u002FMiniLog.Tests\u002FMiniLog.Tests.csproj -c Release dotnet test test\u002FMiniLog.Extensions.Logging.Tests\u002FMiniLog.Extensions.Logging.Tests.csproj -c Release dotnet pack src\u002FMiniLog\u002FMiniLog.csproj -c Release # 产出 NuGet 包 双门禁（提交门槛）：MiniLog \u002F MiniLog.Generators 开启 -warnaserror，Debug 与 Release 下 net8.0 \u002F net10.0 必须 0 警告 0 错误；两套测试全绿才算闭环。贡献前请本地跑齐上述命令。 三、与其他开源日志库对比 MiniLog 与 log4net \u002F NLog \u002F Serilog \u002F MS.Extensions.Logging 定位有本质差异：它保留传统派发模型（Logger → Appender → Layout），但在底层用零分配渲染与源生成器实现数量级性能领先。 3.1 能力矩阵（主流 5 库） 维度 MiniLog log4net NLog Serilog MS.Extensions.Logging 外部依赖 无 无 无 无 无（抽象层） 配置方式 XML \u002F JSON \u002F INI \u002F Builder XML \u002F 代码 XML \u002F JSON \u002F 代码 JSON \u002F 代码 \u002F C# appsettings \u002F 代码 Appender \u002F 输出目标 8 种 20+ 种 80+ Targets Sink 生态（数百） 内置 + 第三方 Provider 零分配渲染 是（热路径） 否 部分 否 取决于 Provider 源生成器 内置（双后端） 无 无 无（用 MEL LoggerMessage） LoggerMessage（官方） 结构化日志 EventId + Scope（值语义） 弱 支持（Layout） 一等公民 一等公民 彩色控制台 ANSI（可选，默认关） ColoredConsoleAppender ColoredConsole 控制台 Sink 主题 控制台 Provider 支持 成熟度 \u002F 生态 预览期 极高 高 高 官方标准 3.2 性能定位 固定消息：MiniLog(26.8µs) \u003C\u003C MS(102µs) \u003C\u003C Serilog(869µs) \u003C\u003C NLog(16.5ms) ≈ log4net(17.6ms) 异步文件：MiniLog(98µs) \u003C\u003C NLog(1.6ms) ≈ MS(1.8ms) \u003C\u003C log4net(2.4ms) \u003C\u003C Serilog(9.8ms) 级别关闭：MiniLog源生成(7.5µs\u002F0B) \u003C MS LoggerMessage(11.5µs\u002F0B) \u003C\u003C MS 原生(仍分配 640KB) vs log4net \u002F NLog：传统派发模型但非文件模式快 600×+，零分配，现代 API。 vs Serilog：Serilog 结构化日志与 Sink 生态最丰富；MiniLog 在性能与分配上显著占优。 vs MS.Extensions.Logging：真实负载下更快且零分配语义打平；MiniLog 通过 MiniLog.Extensions.Logging 直接作为 MS Provider 接入，兼得两者。 完整能力矩阵、性能三段排名与选型建议见 使用手册·对比章节。 四、配置 MiniLog 支持 XML \u002F JSON \u002F INI 三种格式 + Fluent Builder。默认查找 AppDomain.CurrentDomain.BaseDirectory\u002Flog.config.xml，缺失时按 xml→json→ini 优先级自动探测同目录同名配置，均无则回退到 Logs\u002FLog.txt。 最简 XML 示例： \u003C?xml version=\"1.0\" encoding=\"utf-8\"?> \u003Clog SupportsExpiredFileDetector=\"true\" ExpiredFileCheckInterval=\"30\"> \u003CAppenders> \u003CAppender Type=\"Console\" Name=\"console\" Level=\"Info\" \u002F> \u003CAppender Type=\"File\" Name=\"file\" Level=\"Debug\"> \u003CFile FileDirectory=\"Logs\" FileName=\"app\" Extension=\".log\" RollingMode=\"DailyAndSize\" MaxFileSize=\"50\" ExpiredDays=\"30\" \u002F> \u003C\u002FAppender> \u003C\u002FAppenders> \u003CLoggers> \u003CLogger Name=\"MyApp.Data\" Level=\"Debug\"> \u003CAppenders>\u003CAppender>file\u003C\u002FAppender>\u003C\u002FAppenders> \u003C\u002FLogger> \u003C\u002FLoggers> \u003CRoot Level=\"Warn\"> \u003CAppenders>\u003CAppender>console\u003C\u002FAppender>\u003C\u002FAppenders> \u003C\u002FRoot> \u003C\u002Flog> 常用占位符：%timestamp\u002F%thread\u002F%level\u002F%logger\u002F%message\u002F%exception\u002F%newline\u002F%appdomain\u002F%username\u002F%identity\u002F%file\u002F%line\u002F%method\u002F%location\u002F%eventid\u002F%scope\u002F%property\u002F%stacktrace（共 22 个）。 完整配置参考（加载机制、三格式选型、顶层选项、Appender 全属性、File \u002F AdoNet 选项、Logger·Root、滚动模式、三格式完整示例、Fluent Builder、Schema 验证、已知问题）见 MiniLog 使用手册·配置详解 与 CONFIGURATION.md。 五、Appenders 输出目标 共 8 种，均线程安全： 类型 实现 说明 None NoneAppender 丢弃所有日志。用于显式关闭通道或零开销基准。 Console ConsoleAppender 输出到 Console.Out；可选 ANSI 彩色分级。 Debug DebugAppender 输出到 System.Diagnostics.Debugger.Log。 Trace TraceAppender 输出到 System.Diagnostics.Trace.Listeners。 File FileAppender 同步文件追加，内部 lock 保证写入与滚动安全。 AsyncFile AsyncFileAppender 基于 Channels 异步写入，调用方不阻塞；队列满可能丢弃（设计权衡）。 Udp UdpAppender 经 UdpClient 发送渲染文本到远程端点，超长消息截断。 AdoNet AdoNetAppender 参数化 SQL 写关系型数据库；支持零分配直传与异步批量。 选型：低并发用 File，高并发用 AsyncFile。完整 8 种配置与 AdoNet 异步参数见 使用手册·Appenders。 六、性能定位 6.1 基准快照（.NET 8.0，BenchmarkDotNet） 固定消息（10K 次循环总耗时）： 库 Mean 分配 MiniLog（无输出短路） 26.83 µs 0 B MS Logging（未挂 Provider，纯 no-op） 102.52 µs 0 B Serilog 868.70 µs 1.6 MB NLog 16,548.81 µs 1.2 MB log4net 17,561.30 µs 2.0 MB 异步文件（1K 条）： 库 Mean 分配 MiniLog-AsyncFile 97.52 µs 94 KB NLog 1,611.5 µs 171 KB MS Logging 1,781.8 µs 241 KB log4net 2,360.8 µs 350 KB Serilog 9,796.4 µs 491 KB 源生成器级别关闭（10K 次）： 方式 Mean 分配 MiniLog 源生成 7.49 µs 0 B MS LoggerMessage 11.53 µs 0 B MiniLog 原生 API 35.84 µs 0 B MS 原生 LogInformation(params) 232.93 µs 640 KB 横向基准中 MS Logging 未挂载任何 Provider，Log() 在 IsEnabled 即短路为纯 no-op（102µs 是「什么都不做」的代价）。真实项目 MS 必挂 Provider，开销会上升。详细设计与并发\u002F过滤基准见 使用手册·性能设计 与 BENCHMARK_REPORT.md。 6.2 零分配黄金路径 要让日志调用达成热路径零堆分配（对应基准：固定消息 42µs\u002F万条零分配、参数袋 Span 物化 8.8µs\u002F零分配、UDP 新 26ns\u002F零分配；并发 40 万消息 16\u002F18 零 GC），遵循： 用结构化 API 代替字符串插值：logger.Log(new LogEntry { ... }) 或源生成器 Log\u003CTBag>（编译期 FormatTo 零分配直写）；避免 logger.Info($\"User {id}\")（每次分配插值字符串，基准 560KB\u002F万条）。 渲染物化走 Span 直写：Appender 内部默认 WriteToAndClear(TextWriter) 直写（零分配）；仅确需字符串时才调 GetStringAndClear（基准 96KB\u002F千次）。 结构化字段用 %property：经 LogEntry.Properties[\"k\"] = v 设置，%property{k} 渲染；PropertyCount == 0 短路零开销。 高吞吐降载用采样：配置 SamplingFilterOptions，无锁零分配按比例丢弃。 完整四层基准（热方法 \u002F 端到端 \u002F 并发零分配 \u002F 解析）与零回退论证见 BENCHMARK_REPORT.md。 布局模式校验器（编译期 LLG 诊断） MiniLog 内置一个 Roslyn 分析器（MiniLog.Generators），在编译期校验赋值给 AppenderOptions.Pattern \u002F AdoNetParameter.Layout（含 WithPattern(...) \u002F WithLayout(...) 入参、常量折叠与插值字面段）的布局模式串，把 %token 拼写 \u002F 格式错误拦在构建前，而非运行时解析失败。经 NuGet 包引入时分析器自动随包进入 analyzers\u002Fdotnet\u002Fcs，消费方编译期即得校验；配置文件（XML \u002F JSON \u002F INI）字面量则由 ConfigurationBinder 运行期探针以 Trace 警告兜底。 诊断 触发条件 示例 LLG0002 未知占位符（附最近邻建议） %levl → 是否指 %level LLG0003 未闭合的 { %date{yyyy-MM-dd LLG0004 空选项 {} \u002F { } %property{} LLG0005 已知令牌带不应有的选项 %level{critical} LLG0006 %date \u002F %timestamp 选项保留字拼写错误 %date{ISO860} → ISO8601 保留字（LLG0006 建议集）：ISO8601 \u002F DATE \u002F ABSOLUTE \u002F COMPACT；精确匹配或任意 .NET 格式（如 yyyy-MM-dd）合法、不触发。 \u002F\u002F 编译期即报错，而非运行时才发现布局串写错 new AppenderOptions { Pattern = \"%levl %logger\" }; \u002F\u002F ⚠ LLG0002 未知 'levl'（是否指 'level'?） new AppenderOptions().WithPattern(\"%date{yyyy-MM-dd\"); \u002F\u002F ⚠ LLG0003 未闭合 new AppenderOptions { Pattern = \"%property{}\" }; \u002F\u002F ⚠ LLG0004 空选项 new AppenderOptions { Pattern = \"%level{x}\" }; \u002F\u002F ⚠ LLG0005 'level' 不接受选项 new AppenderOptions { Pattern = \"%date{ISO860}\" }; \u002F\u002F ⚠ LLG0006 疑似 'ISO8601' \u002F\u002F 配置文件（经 NuGet 分析的消费方亦生效，IDE 实时波浪线 + 构建警告） \u003CAppender Pattern=\"%levl %level\" \u002F> \u002F\u002F ⚠ 未知占位符 'levl'（是否指 'level'?） 有意不做（编译期不可判定）：非常量动态值（变量、含非 const 孔的插值）、%date{非法格式} 格式合法性、%property{不存在的键} 键存在性 —— 交由运行时解析兜底。 七、文档导航 文档 内容 MiniLog 使用手册（中文） 核心特性 \u002F 安装 \u002F 快速开始 \u002F 核心概念 \u002F 配置详解 \u002F Appenders \u002F 过滤器 \u002F 彩色控制台 \u002F 结构化日志 \u002F 源生成器 \u002F MEL 集成 \u002F 性能设计 \u002F 与其他开源库对比 \u002F log4net 迁移 \u002F 许可证 配置参考 XML \u002F JSON \u002F INI 全部配置项、加载机制、Fluent API、Schema 验证、15 条已知问题 MEL 集成指南 与 Microsoft.Extensions.Logging 集成的权威深度文档：注册 API 全景 \u002F 两种生命周期模型 \u002F 级别·名称·结构化·Scope 映射 \u002F IConfiguration 桥接原理 \u002F 热重载 \u002F 排错 基准报告 BenchmarkDotNet 性能数据 编译期诊断码总表 LLG0001–LLG0015 目录 \u002F 配置文件分析器触发范围 \u002F MEL 路径边界 变更日志 版本变更记录（1.0.0 GA 起，按需补充） 八、许可证 MIT —— 详见 LICENSE（仓库根目录）。",9673,{"id":6,"kind":7,"title":11,"summary":13,"image":14,"href":15,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":39},"2026 · 软件开发","#2563eb","16 \u002F 10",[18],{"targetType":8,"targetId":9,"likedByMe":41,"likeCount":42,"commentCount":42,"contentLikeCount":42,"contentCommentCount":42,"sourceLikeCount":42,"sourceCommentCount":42},false,0,[44,51,57,64,71,78,84,90],{"id":45,"kind":7,"title":46,"summary":47,"image":48,"href":49,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":50},"NEWS_ARTICLE:927","HelloCrab - 短视频开源爬虫，仅供学习参考","HelloCrab 基于 Avalonia、Playwright、AI与 FFmpeg 的跨平台桌面采集器，支持9大平台，以及 Android、iOS、Browser 远程控制端。 Made By ChatGPT &amp; Vincent with ❤ 平台 是否接入 哔哩哔哩 ✅ 抖音 ✅ 快手","https:\u002F\u002Fwww.cnblogs.com\u002Fhupo376787\u002Fp\u002FScreenshot\u002FWindows.jpg","\u002Fnews\u002F927",[18],{"id":52,"kind":7,"title":53,"summary":54,"image":14,"href":55,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":56},"NEWS_ARTICLE:929",".NET 异常处理的\"暗门\"：代码里写满 catch，你依然能抓住它——从一个 AI Agent 运行时的源码说起","一个健壮的系统，必然到处都是有意的 catch；异常被消化不等于问题不存在。 观测与韧性，是一个硬币的两面——降级逻辑保证系统不崩，FirstChance 保证你能看见它为什么降级。","\u002Fnews\u002F929",[18],{"id":58,"kind":7,"title":59,"summary":60,"image":61,"href":62,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":63},"NEWS_ARTICLE:933","写给 C++ 工程师的 OpenClaw.NET 上手指南：用你熟悉的 C++ 思维，跑起一个生产级 AI Agent","它像一个「基于 boost.asio + REST 端点的常驻服务」——对外是 HTTP \u002F WebSocket \u002F 各 IM 的 webhook，对内跑着一个能调工具、读写记忆、跨渠道对话的 AI Agent——只不过协程不用你手写 promise_type，内存不用你管 new\u002Fdelete。","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F510\u002F202609\u002F510-20260905070811424-1837144874.jpg","\u002Fnews\u002F933",[18],{"id":65,"kind":7,"title":66,"summary":67,"image":68,"href":69,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":70},"NEWS_ARTICLE:952",".NET 11 RC1 发布：拿到\"准生证\"，生产环境可以上了！","从 Preview 1 到 RC1，.NET 11 的拼图基本完整了：Runtime Async 反超状态机模型、CoreCLR 登陆 WebAssembly、CLI 全面 NativeAOT 化（dotnet tool list 快 5.5 倍）、C# 15 补齐 union 和 labeled","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F510\u002F202609\u002F510-20260909153805786-850851443.png","\u002Fnews\u002F952",[18],{"id":72,"kind":7,"title":73,"summary":74,"image":75,"href":76,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":77},"NEWS_ARTICLE:961","从零搭建ELK日志采集系统：Filebeat + Logstash + ES + Kibana 保姆级教程","轻量级架构，一份配置全搞定 一、前言 你是不是还在用 tail -f 和 grep 在多台服务器上翻日志？系统一出问题，就要登录三五台机器，来回切换窗口，定位一个Bug耗时半小时。 ELK 是业界最成熟的日志集中管理方案。本文将带你用 Docker Compose 一键部署 Filebeat + L","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F1465907\u002F202609\u002F1465907-20260909162947190-195439361.png","\u002Fnews\u002F961",[18],{"id":79,"kind":7,"title":80,"summary":81,"image":61,"href":82,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":83},"NEWS_ARTICLE:980","写给 Rust 工程师的 OpenClaw.NET 上手指南：用你熟悉的 Rust 思维，跑起一个生产级 AI Agent","它像一个「axum 应用」——对外是 HTTP \u002F WebSocket \u002F 各 IM 的 webhook，对内跑着一个能调工具、读写记忆、跨渠道对话的 AI Agent——只不过 async 不用选 runtime，也不用和借用检查器格斗。","\u002Fnews\u002F980",[18],{"id":85,"kind":7,"title":86,"summary":87,"image":14,"href":88,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":89},"NEWS_ARTICLE:999","Vane.Dispatch 1.0.0 发布：一个与容器、传输层零耦合的 .NET 服务分发引擎","Vane.Dispatch 1.0.0 发布：一个与容器、传输层零耦合的 .NET 服务分发引擎 它的前身，可以追溯到一个叫 Ndf 的项目。从那时算起，已经过去了十多年。今天，它以 Vane.Dispatch 1.0.0 的名字正式发布。 序：十年磨一剑 做后端的人大抵都绕不开同一个问题：如何把&","\u002Fnews\u002F999",[18],{"id":91,"kind":7,"title":92,"summary":93,"image":94,"href":95,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":96},"NEWS_ARTICLE:1002","从对标 Java 到对标 Go：Native AOT 的\"无痛化\"之路，走到哪一站了？","从 .NET 7 的 demo 到 .NET 12 的无痛化，这条路要走五年。慢吗？慢。但对比一下：Java 的 GraalVM Native Image 折腾了更久，至今 Spring 生态的 AOT 体验仍在打补丁；Go 则是天生就站在终点线上——.NET 是在背着二十年的反射遗产追赶一个轻装上","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F510\u002F202609\u002F510-20260907133134585-1733425989.png","\u002Fnews\u002F1002",[18]]