用途:为 .NET 10 应用提供结构化日志,将日志事件以可查询的属性形式记录,便于检索与分析。
主要能力:两阶段初始化,先建 bootstrap logger 捕获启动错误,DI 就绪后再替换为完整 logger;推荐 builder.Services.AddSerilog() 而非 UseSerilog(),可通过 ReadFrom.Services(services) 接入 DI;使用消息模板 {PropertyName} 生成结构化数据,避免字符串插值;通过 appsettings.json 配置日志级别、sinks 与覆盖规则,便于按环境调整;支持 enrichers,如 FromLogContext、WithMachineName、WithEnvironmentName,以及自定义属性;支持多种 sinks,包括 Console、File、Seq、OpenTelemetry(OTLP)、Elasticsearch(官方 Elastic.Serilog.Sinks);提供 UseSerilogRequestLogging() 将每请求多条日志合并为单条摘要;支持 LogContext.PushProperty 推入作用域属性;Serilog.Expressions 可按表达式过滤,如排除健康检查噪音或将错误写入单独文件;[LoggerMessage] 源生成器适用于高性能路径,级别禁用时零分配。
必要用法:日志调用使用命名参数模板,如 logger.LogInformation("Order {OrderId} placed by {CustomerId} for {Total:C}", orderId, customerId, total);用 @ 保留对象结构、$ 强制 ToString;作用域属性需在配置中启用 .Enrich.FromLogContext();应用退出前须 await Log.CloseAndFlushAsync(),否则异步 sink 会丢失缓冲事件。
限制与注意事项:不要用字符串插值记录日志;不要跳过 CloseAndFlush;不要记录密码、令牌等敏感数据或 PII;反序列化需设置深度、字符串长度、集合数量上限,避免大对象图导致内存问题;Serilog.Sinks.Elasticsearch 包已弃用,应改用 Elastic.Serilog.Sinks。