.NET 微服务日志系统:Serilog + Loki + Grafana 实践指南
在 .NET 微服务架构中,日志是问题排查、系统监控和业务分析的核心支撑。传统日志存储(如本地文件)存在分散、查询效率低、可视化弱等问题,而 Serilog(日志采集)+ Loki(日志存储与索引)+ Grafana(日志可视化与分析) 组合,能实现“采集-存储-分析-可视化”全链路日志管理,尤其适配微服务分布式场景。

一、技术栈核心角色与优势
先明确三者的分工的协同逻辑,理解为何这套组合适合 .NET 微服务:
| 组件 | 核心角色 | 适配 .NET 微服务的优势 |
|---|---|---|
| Serilog | 日志采集器(Logger) | 1. 原生支持 .NET 全框架(.NET Framework/.NET Core/.NET 5+); 2. 结构化日志(JSON 格式),便于 Loki 解析; 3. 丰富的 Sink(输出目标),可直接对接 Loki; 4. 支持微服务核心字段(服务名、实例ID、TraceID)的自动注入。 |
| Loki | 日志存储与索引引擎(Log Store) | 1. 轻量级设计,占用资源远低于 ELK(Elasticsearch); 2. “标签索引+原始日志”存储模式,查询效率高(只索引关键标签,不全文索引); 3. 原生支持 Prometheus 生态,可与微服务监控(如 Prometheus)联动; 4. 支持分布式场景下的日志聚合,按服务/实例/环境筛选。 |
| Grafana | 日志可视化与分析平台(UI) | 1. 提供 Loki 专属数据源插件,查询语法直观(LogQL); 2. 支持日志与监控指标(如 Prometheus metrics)联动展示; 3. 可自定义仪表盘(Dashboard),适配微服务多维度日志分析; 4. 支持告警配置,日志异常时实时通知。 |
二、系统架构与数据流向
在 .NET 微服务集群中,日志的完整流转路径如下:
- 日志产生:.NET 微服务内部通过 Serilog 记录日志(如接口请求、异常、业务事件);
- 日志结构化:Serilog 将日志格式化为 JSON 结构,包含
ServiceName(服务名)、InstanceId(实例ID)、TraceId(调用链ID)、Level(日志级别)等核心标签; - 日志发送:通过 Serilog.Sinks.Loki 插件,将结构化日志推送到 Loki 服务;
- 日志存储:Loki 对日志按标签建立索引(如
service=order-service),并存储原始日志数据; - 日志查询与可视化:Grafana 连接 Loki 数据源,通过 LogQL 查询日志,并以仪表盘、表格、图表等形式展示,支持多维度筛选和异常告警。
三、分步实现:从环境搭建到微服务集成
1. 前置准备
- 环境要求:Docker(快速部署 Loki 和 Grafana,避免复杂的本地安装);.NET 6+ 微服务项目(示例以 .NET 8 为例);
- 工具:Docker Compose(一键启动 Loki 和 Grafana)、Visual Studio/VS Code(开发 .NET 项目)。
2. 第一步:用 Docker Compose 部署 Loki + Grafana
通过 Docker Compose 快速启动依赖服务,无需手动配置 Loki 存储、Grafana 插件。
步骤1:创建 docker-compose.yml 文件
version: "3.8"
services:
# Loki 服务(日志存储)
loki:
image: grafana/loki:2.9.2 # 选择稳定版本
ports:
- "3100:3100" # Loki 默认端口
volumes:
- ./loki/data:/loki # 持久化存储日志数据
command: -config.file=/etc/loki/local-config.yaml # 使用默认配置(适合测试,生产需自定义)
networks:
- log-network
# Grafana 服务(日志可视化)
grafana:
image: grafana/grafana:10.2.2
ports:
- "3000:3000" # Grafana 默认端口
volumes:
- ./grafana/data:/var/lib/grafana # 持久化 Grafana 配置(如数据源、仪表盘)
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin # 初始管理员密码(生产需修改)
- GF_INSTALL_PLUGINS=grafana-loki-datasource # 自动安装 Loki 数据源插件
depends_on:
- loki # 确保 Loki 启动后再启动 Grafana
networks:
- log-network
networks:
log-network:
driver: bridge
步骤2:启动服务
在 docker-compose.yml 所在目录执行命令:


3255

被折叠的 条评论
为什么被折叠?



