Serilog.NET 中的日志使用技巧

💡 原文中文,约2400字,阅读约需6分钟。
📝

内容提要

Serilog是.NET生态系统中受欢迎的日志框架,具有灵活性、可扩展性和易用性。文章介绍了Serilog的基本配置、结构化日志记录、日志级别、写入到文件、过滤日志和使用Enrichers添加额外信息的技巧。通过掌握这些技巧,可以更有效地使用Serilog记录和分析应用程序的日志。

🔎

延伸解读

结构化日志:从文本到可查询数据

Serilog 的结构化日志记录将日志消息视为模板,参数作为属性存储,而非简单拼接字符串。例如,使用 {ItemId} 和 {Timestamp} 占位符,日志系统能保留这些字段的原始类型和名称。这使后续的过滤、搜索和聚合分析更加高效,尤其适合集中式日志平台。开发者应养成使用结构化模板的习惯,避免字符串插值,以充分利用 Serilog 的核心优势。

日志级别与过滤:控制日志量的关键

Serilog 提供从 Verbose 到 Fatal 的多个日志级别,允许按需记录不同严重程度的事件。通过 MinimumLevel 设置全局最低级别,再结合 .Filter.ByIncludingOnly 进行细粒度过滤,可以只保留关键日志,减少噪音。例如,仅记录 Error 级别日志有助于快速定位问题,但可能丢失上下文。合理平衡级别与过滤条件,是保证日志有效性的重要实践。

文件写入与保留策略:避免磁盘失控

使用 RollingFile 写入器时,可以按日期滚动日志文件,并通过 retainedFileCountLimit 参数限制保留的文件数量。示例中保留 7 个文件,能防止日志无限增长占用磁盘空间。开发者应根据应用日志量和磁盘容量调整该值,同时注意文件路径中的 {Date} 占位符会被替换为当前日期,确保文件命名符合预期。

Enrichers 与 LogContext:添加上下文信息

Enrichers 允许向日志事件添加额外属性,如通过 LogContext.PushProperty 在特定代码块内附加 UserId 等上下文。这些属性会自动包含在该作用域内所有日志事件中,便于追踪用户操作或请求链路。使用时需注意作用域范围,避免属性泄漏到无关日志。结合结构化日志,Enrichers 能显著提升日志的排查价值。

❓

Q&A

如何在项目中安装Serilog包?

可以通过NuGet包管理器安装Serilog包,使用命令:Install-Package Serilog。

Serilog支持哪些日志级别?

Serilog支持的日志级别包括Verbose、Debug、Information、Warning、Error和Fatal。

如何将Serilog的日志写入文件?

可以使用RollingFile或File写入器,将日志配置为写入指定文件,例如:WriteTo.RollingFile("logs/myapp-{Date}.txt")。

什么是结构化日志记录,如何使用?

结构化日志记录允许将日志消息作为模板,使用占位符替换参数,方便过滤和搜索日志。

如何过滤Serilog的日志?

可以使用.Filter方法,根据条件过滤日志,例如只记录错误级别的日志:.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Error)。

Enrichers在Serilog中有什么作用?

Enrichers允许向日志事件中添加额外信息,如上下文信息,使用LogContext.PushProperty可以添加属性。

🏷️

标签

➡️

继续阅读