📝 ABP VNext + Grafana Loki:集中式日志聚合
📚 目录
一、引言
✨ TL;DR
- 用 Serilog 将 ABP 应用日志推送到 Grafana Loki,实现结构化、标签化存储,便于查询和追踪。
- 在 Grafana 中配置日志面板、查询模板与告警规则,支持多服务多环境的统一日志聚合。
- 实现高可用、可扩展的日志管理体系,轻松定位问题并提高运维效率。
📚 背景与动机
在 ABP 微服务架构下,日志分散在多个服务实例中,排查问题时需要登录多个实例查看日志,运维成本高且不便实时监控。Grafana Loki 通过仅索引日志的标签,结合 Grafana 原生支持,能够实现零运维的集中式日志解决方案,极大提升查询性能与可用性。本教程展示了如何在 ABP VNext 应用中,结合 Serilog 和 Grafana Loki 构建高效、可复现的日志管理系统。
二、环境与依赖
🛠️ 平台版本
- .NET 6 + ABP VNext 6.x
- Grafana ≥ 9.x、Loki ≥ 2.x
🔗 NuGet 包
Serilog.AspNetCoreSerilog.Sinks.Grafana.Loki(支持/loki/api/v1/push接口)Serilog.Formatting.Compact(结构化 JSON 格式)
⚙️ 基础服务
- Loki ▶ HTTP 接收器(
<loki_host>:3100) - Grafana ▶ 配置 Data Source 指向 Loki
三、Serilog + Loki 集成
3.1 安装与配置
首先在项目中安装必需的 NuGet 包:
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.Grafana.Loki
dotnet add package Serilog.Formatting.Compact
在 Program.cs 中进行 Serilog 配置:
using Serilog;
using Serilog.Formatting.Compact;
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.WithProperty("Application", "OrderService")
.Enrich.WithProperty("Environment", builder.Environment.EnvironmentName)
.Enrich.WithProperty("TraceId", Activity.Current?.TraceId.ToString() ?? "unknown")
.Enrich.WithProperty("TenantId", "Tenant123")
.WriteTo.Console(new RenderedCompactJsonFormatter())
.WriteTo.GrafanaLoki("http://loki:3100", labels: new Dictionary<string, string>
{
{
"Application", "OrderService" },
{
"Environment", builder.Environment.EnvironmentName }
})
.CreateLogger();
builder.Host.UseSerilog();
3.2 添加标签
为了进一步增强日志的可查询性,可以在日志中加入更多的标签,如 TraceId 和 TenantId,使得日志查询更加精确。
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.WithProperty("Application", "OrderService")
.Enrich.WithProperty("Environment", builder.Environment

最低0.47元/天 解锁文章
3124

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



