答案是通过结构化日志与云原生集成实现集中管理。.NET应用使用Serilog输出JSON格式日志至stdout,结合Kubernetes日志采集器(如Fluent Bit)或云服务(如Azure Monitor、CloudWatch)实现统一收集,并利用OpenTelemetry关联追踪上下文,确保时间戳、级别和堆栈完整,提升可观测性。

在 .NET 应用中实现日志记录与云原生平台的集成,关键是将日志从应用内部输出高效、可靠地传输到集中式日志系统,并适配容器化和分布式环境。.NET 提供了灵活的日志抽象(如 Microsoft.Extensions.Logging),结合云原生平台(如 Kubernetes、AWS、Azure 等)的能力,可以实现统一管理。
使用结构化日志输出
云原生环境中推荐使用结构化日志(如 JSON 格式),便于后续解析和分析。
- 采用 Serilog 替代默认的 Console Logger,自动输出结构化日志。
- 配置 Serilog 将日志写入 stdout,例如使用 Serilog.Sinks.Console 并设置为 JSON 格式。
- 容器平台(如 Kubernetes)通过日志采集器(如 Fluent Bit、Filebeat)收集 stdout 日志并转发到后端(如 Elasticsearch、Loki、CloudWatch)。
对接云平台日志服务
不同云厂商提供托管日志服务,.NET 应用可通过专用 Sink 直接发送日志。
- Azure 用户可使用 Serilog.Sinks.AzureAnalytics 或将日志推送到 Azure Monitor。
- AWS 上可通过 Serilog.Sinks.AwsCloudWatch 写入 CloudWatch Logs。
- Google Cloud 使用 Google.Cloud.Logging.V2 客户端库集成 Cloud Logging。
在 Kubernetes 中配置日志收集
Kubernetes 不直接存储日志,依赖边车(sidecar)或节点级代理收集容器 stdout。
- 确保 .NET 应用将日志写入控制台(Console.WriteLine 或 ILogger 输出)。
- 在 Pod 中部署 Fluent Bit 或 Logstash 作为 DaemonSet,抓取容器日志。
- 通过标签(labels)和命名空间区分微服务日志,便于查询。
关联请求跟踪与上下文信息
在分布式系统中,单一请求可能跨越多个服务,需结合日志与追踪(tracing)提升可观测性。
- 使用 Activity 或 OpenTelemetry 记录调用链路,将 TraceId 注入日志。
- 在 Serilog 中启用 Enrich.FromLogContext(),自动携带请求上下文(如 RequestId、UserId)。
- 将日志与指标、追踪数据统一接入观测平台(如 Jaeger + Loki + Grafana 或 Azure Application Insights)。
基本上就这些。关键是把日志变成结构化的、可被自动化采集的数据流,再结合云平台能力实现集中查看和告警。不复杂但容易忽略细节,比如时间戳格式、日志级别映射和异常堆栈完整输出。










