.NET 日志库怎么选:ILogger、Serilog、NLog、log4net 横向对比
.NET 日志方案选型中文指南:内置 ILogger(Microsoft.Extensions.Logging)、Serilog、NLog、log4net 四大方案的结构化能力、配置方式、性能与维护状态对比,附选型决策建议与观测云平台接入方案。
.NET 日志生态的四个主流选择——内置 ILogger 抽象、Serilog、NLog、log4net——各有清晰的适用边界。本文做一次系统的横向对比,帮你在新项目选型与老系统演进时做出不纠结的决策。
核心要点速览
- 内置 ILogger 是抽象层而非完整方案:简单应用够用,复杂需求靠第三方 Provider 补。
- Serilog 是新项目首选:消息模板 + 一流 JSON + Sink 生态,结构化体验最好。
- NLog 是灵活的老牌强者:XML 路由规则表达力强,热重载友好,与 Serilog 伯仲之间。
- log4net 只维护存量:更新稀少、无现代结构化支持,新项目不要选。
四大方案对比表
| 维度 | ILogger(内置) | Serilog | NLog | log4net |
|---|---|---|---|---|
| 定位 | 日志抽象 + 基础 Provider | 结构化日志框架 | 全能日志框架 | 老牌日志框架 |
| 结构化字段 | 消息模板支持 | 一流(消息模板 + 解构) | 支持(属性 + JsonLayout) | 弱(MDC 属性) |
| JSON 输出 | 需 Console JSON Provider | 原生 Formatter | JsonLayout | 需第三方扩展 |
| 输出目的地 | 少量官方 Provider | 数百种 Sink | 丰富 Target | 丰富 Appender |
| 文件轮转 | 无 | 内建(滚动 Sink) | 内建(archive 配置) | 内建(RollingFileAppender) |
| 配置方式 | 代码/配置 | 代码/appsettings | XML/代码,热重载 | XML/代码 |
| 维护状态 | 官方持续更新 | 活跃 | 活跃 | 低活跃 |
| 新项目推荐度 | 简单应用 | ★★★★★ | ★★★★ | 不推荐 |
逐款点评
1. ILogger(Microsoft.Extensions.Logging)
.NET 官方日志抽象:六个级别、消息模板、Provider 可插拔,ASP.NET Core 深度集成。简单 Web 服务用内置 Console(JSON 模式)Provider 就能满足生产需求。它的真正价值是"面向抽象编程":业务代码只依赖 ILogger,底层换成 Serilog/NLog 只需改启动装配。
2. Serilog:结构化日志的开创者
消息模板 {UserId} + @ 解构的组合拳让结构化日志成为默认姿势;Sink 生态覆盖几乎所有目的地;UseSerilog 与 ASP.NET Core 无缝集成;LogContext 动态上下文注入优雅。新 .NET 项目的默认推荐。
3. NLog:路由规则的王者
targets/rules 两段式 XML 配置表达力极强——按 logger 名/级别分流、降噪、多目标各配格式,autoReload 热重载对生产调级别非常友好。JsonLayout 输出质量不输 Serilog。与 Serilog 的选择更多看团队口味。
4. log4net:功勋老将
log4j 移植,概念(Logger/Appender/Layout)影响了一代 .NET 工程师。稳定可靠但更新稀少,无原生 JSON 与消息模板。存量系统继续维护,新项目不引入。
选型决策建议
- 新项目默认:ILogger 抽象 + Serilog Provider(
UseSerilog),兼得标准抽象与最强结构化; - 偏好 XML 声明式配置/复杂路由:NLog;
- 极简微服务:纯内置 ILogger + Console JSON Provider;
- log4net 存量:维护为主,新代码面向 ILogger 编程,逐步收敛。
观测云落地:一套接入打天下
四个方案的平台接入完全一致:
- 输出契约:JSON 格式(ILogger 的 Console JSON、Serilog JsonFormatter、NLog JsonLayout、log4net JSON 扩展),写 stdout(容器)或滚动文件(主机)。
- DataKit 采集:stdout 自动采集或
logging.conf文件采集,source: dotnet-app、service区分服务,JSON 自动解析为字段。 - Pipeline 标准化:级别映射标准
status,时间戳解析为time,trace_id 提取为顶层字段。 - 平台能力:日志查看器检索聚类、监控器告警(钉钉/企业微信/飞书)、多索引成本控制、APM trace_id 双向跳转——全部与框架选型解耦。
常见问题(FAQ)
ILogger 会不会取代 Serilog/NLog?
不会。ILogger 是抽象与最小实现,微软刻意保持精简;轮转、丰富输出端、高级过滤这些能力长期会留给社区。正确姿势是组合而非替代。
Serilog 和 NLog 性能差多少?
常规业务场景无感知差异。极限吞吐下两者都有异步方案(Async Sink / AsyncWrapper)。选型看 API 偏好与团队熟悉度,不看微基准。
可以同时用两个框架吗?
技术上可以(比如过渡期),但要统一输出格式与目的地,否则平台侧解析规则翻倍。过渡期建议尽早收敛到一个框架。
.NET Framework 老项目呢?
log4net/NLog 对 .NET Framework 支持最好;Serilog 也可用于 .NET Framework 4.6.1+。接入观测云的方式相同——文件采集 + Pipeline 解析。
系列阅读
- 上一篇:log4net 实战指南
- 下一篇:Java 日志最佳实践十条
- 相关阅读:Serilog 实战 | NLog 实战 | 如何选择日志框架