ABP VNext + Grafana Loki:集中式日志聚合

📝 ABP VNext + Grafana Loki:集中式日志聚合


📚 目錄

  • 📝 ABP VNext + Grafana Loki:集中式日志聚合
    • 一、引言
      • ? TL;DR
    • 二、環境與依賴
      • 🛠? 平臺版本
      • 🔗 NuGet 包
      • ?? 基礎服務
    • 三、Serilog + Loki 集成
      • 3.1 安裝與配置
      • 3.2 添加標簽
    • 四、Loki 數據源與推送格式
      • 錯誤處理與重試機制
    • 五、Grafana 配置
      • 5.1 新建 Loki Data Source
      • 5.2 日志面板(Explore)
    • 六、儀表盤與告警
      • 6.1 自定義儀表盤
      • 6.2 告警規則
      • 告警通知配置
    • 七、多服務與多環境
      • 📦 統一標簽策略
      • 🔄 Grafana Dashboard 復用
      • Grafana Provisioning
    • 八、性能與可靠性最佳實踐
      • ?? 批量/緩沖
      • 💾 Durable Sink 保障可靠性
      • 📊 Loki 索引策略
      • ? 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.xLoki ≥ 2.x

🔗 NuGet 包

  • Serilog.AspNetCore
  • Serilog.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 添加標簽

為了進一步增強日志的可查詢性,可以在日志中加入更多的標簽,如 TraceIdTenantId,使得日志查詢更加精確。

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();

四、Loki 數據源與推送格式

Loki Push API 的日志數據格式要求如下:

{"streams": [{"stream": { "label1": "value1", "label2": "value2" },"values": [[ "1621373445000000000", "log line 1" ],[ "1621373446000000000", "log line 2" ]]}]
}

Serilog.Sinks.Grafana.Loki 會自動批量打包日志,并推送到 Loki。每條日志會自動包裝成這種 JSON 格式,因此你不需要自己處理日志格式。

錯誤處理與重試機制

為了確保日志的可靠性,當 Loki 推送失敗時,我們可以使用 Serilog Sink 的失敗重試機制,或者將失敗日志臨時保存在本地文件中進行重試。以下是配置重試機制的示例:

.WriteTo.GrafanaLoki("http://loki:3100", labels: new Dictionary<string, string> {{"Application", "OrderService"}})
.WithAutomaticRetries(maxRetries: 5, delayBetweenRetries: TimeSpan.FromSeconds(5))

五、Grafana 配置

5.1 新建 Loki Data Source

在 Grafana 中創建 Loki 數據源:

  1. 在 Grafana 控制臺選擇 Data Sources,點擊 Add Data Source
  2. 選擇 Loki,輸入 Loki 的地址 http://<loki_host>:3100,然后點擊 Save & Test 驗證連接是否成功。

5.2 日志面板(Explore)

示例查詢

{Application="OrderService", Environment="Production"}|= "Error"|= "Exception"

使用模板變量 $app$env 來動態切換服務和環境:

{Application="$app", Environment="$env"} |= "Error"

六、儀表盤與告警

6.1 自定義儀表盤

每分鐘日志量

count_over_time({Application="$app"}[1m])

錯誤級別趨勢

rate({level="Error",Application="$app"}[5m])

請求延遲分布(假設記錄了 Duration 字段):

histogram_quantile(0.95, sum(rate({Application="$app"} |= "Duration" [$__interval])) by (le))

推薦的布局包括概覽、異常詳情、容量監控。

6.2 告警規則

示例告警規則

  • Rule 1:5 分鐘內 Error 日志 ≥ 50 ? 發送通知。
  • Rule 2:日志包含關鍵異常關鍵字(如 NullReferenceException)? 立即告警。

通知渠道:Email、Slack、Teams。

告警通知配置

Grafana 支持將告警通知集成到 Slack、Teams、Email 等渠道。在 Grafana 的 Alerting 設置中,可以創建通知渠道,并將其配置到特定告警規則中。


七、多服務與多環境

📦 統一標簽策略

為了在不同環境和服務之間聚合日志,推薦使用統一的標簽策略:ApplicationEnvironmentTenant 等。這樣可以幫助開發者在查詢日志時使用一致的命名方式。

🔄 Grafana Dashboard 復用

通過模板變量,如 $app$env,實現多實例監控,避免重復配置。你可以在一個 Grafana 儀表盤中查看多個服務和環境的數據,只需動態切換模板變量即可。

Grafana Provisioning

為了自動化管理多個 Grafana 實例的配置,可以使用 Provisioning 功能,將儀表盤和數據源配置文件化,從而實現批量部署和配置同步。


八、性能與可靠性最佳實踐

?? 批量/緩沖

調整 batchPostingLimitperiod 配置,以優化推送頻率和批量大小。不同的日志 Sink 可能有不同的配置選項,請參考官方文檔調整。

💾 Durable Sink 保障可靠性

為了確保日志的可靠性,建議配置帶本地文件緩沖的 Durable Sink,例如:

.WriteTo.DurableHttpUsingFileSizeRolledBuffers("http://loki:3100", fileSizeLimitBytes: 50_000_000)

📊 Loki 索引策略

  • 避免標簽的高基數(Cardinality),如每個日志條目的 UserIdSessionId
  • 只使用必要的標簽,避免過多的字段導致存儲和查詢性能下降。

? Loki 高可用部署

對于生產環境,建議將 Loki 部署為分布式系統,使用 DistributorIngesterQuerier 等組件來提升可用性和水平擴展能力。可以使用 Docker Compose 或 Kubernetes 配置 Loki 集群。


九、端到端示例

  1. 啟動 Loki & Grafana Docker 容器
    使用以下 docker-compose.yml 啟動 Loki 和 Grafana:

    version: '3.7'
    services:loki:image: grafana/loki:2.8.2command: -config.file=/etc/loki/local-config.yamlports:- "3100:3100"grafana:image: grafana/grafana:9.5.0ports:- "3000:3000"
    
  2. 配置 ABP 項目 Serilog
    在 ABP 項目的 Program.cs 中按照 3.1 配置 Serilog。

  3. 生成多級別日志
    在代碼中添加不同級別的日志:Log.Information(), Log.Warning(), Log.Error()

  4. 在 Grafana Explore 中執行查詢
    使用示例查詢來可視化日志。

  5. 創建告警規則
    設置一個告警規則,并模擬觸發 Error 日志來測試告警。


日志流轉流程

ABP 應用
Serilog
Loki Push API
Distributor
Ingester
Querier
Loki
Grafana
日志查詢與可視化
告警通知

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89813.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分布在內側內嗅皮層(MEC)的帶狀細胞對NLP中的深層語義分析有什么積極的影響和啟示

帶狀細胞&#xff08;Band Cells&#xff09;作為內側內嗅皮層&#xff08;Medial Entorhinal Cortex, MEC&#xff09;層Ⅱ/Ⅲ的核心空間編碼單元&#xff08;如網格細胞、頭方向細胞等&#xff09;&#xff0c;其獨特的神經計算機制為自然語言處理&#xff08;NLP&#xff09…

Django Ninja

Django Ninja 是一個用于 Django 框架的快速、現代化的 API 開發庫&#xff0c;旨在簡化構建高性能、類型安全的 RESTful API。它受到 FastAPI 的啟發&#xff0c;結合了 Django 的強大功能和 FastAPI 的簡潔與現代化設計&#xff0c;特別適合需要快速開發、易于維護且具有強類…

iic時序

數據和應答信號都規定在SCL在高電平期間&#xff0c;SDA電平穩定&#xff1b;SCL在低電平期間&#xff0c;SDA電平才可以變化。要不然容易被誤認為起始或停止信號。應答信號&#xff1a;1. 第九個SCL之前的低電平期間將SDA拉低2. 確保在SCL為高電平時&#xff0c;SDA為穩定的低…

GitHub+Git新手使用說明

Git Git是一個在本地用于隨時保存和查看歷史版本的軟件Git的三個概念&#xff1a;提交commit、倉庫repository、分支branch Git安裝 在電腦里面按winR&#xff0c;輸入cmd進入終端后輸入git --version&#xff0c;然后再次輸入where git&#xff0c;查看git所在位置 Git常用語句…

前端圖像視頻實時檢測

需求&#xff1a;在目標檢測時&#xff0c;我們要求前端能夠將后端檢測的結果實時渲染在圖片或者視頻上。圖片是靜態的&#xff0c;只需要渲染一次&#xff1b;而視頻是動態的&#xff0c;播放時需要根據幀數來實時渲染標注框&#xff0c;可以想象視頻就是由一張張圖片播放的效…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘sqlalchemy’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘sqlalchemy’問題 摘要 在使用 PyCharm 控制臺執行 pip install sqlalchemy 后&#xff0c;仍然在代碼中提示 ModuleNotFoundError: No module named sqlalche…

第4.3節 iOS App生成追溯關系

iOS生成追溯關系的邏輯和Android端從用戶角度來說是一致的&#xff0c;就是需要通過開始和結束關聯用例&#xff0c;將用例信息與覆蓋率信息建立關系&#xff0c;然后再解析覆蓋率數據。 4.3.1 添加關聯用例彈層 關聯用例彈層和Android類似&#xff0c;只要你能設計出相應的樣…

STM32 USB鍵盤實現指南

概述 在STM32上實現鍵盤功能可以通過USB HID(人機接口設備)協議來實現,使STM32設備能被計算機識別為標準鍵盤。以下是完整的實現方案: 硬件準備 STM32開發板(支持USB,如STM32F103、STM32F4系列) USB接口(Micro USB或Type-C) 按鍵矩陣或單個按鍵 必要的電阻和連接…

繼電器基礎知識

繼電器是一種電控制器件,它具有隔離功能的自動開關元件,廣泛應用于遙控、遙測、通訊、自動控制、機電一體化及電力電子設備中,是最重要的控制元件之一。 繼繼電器的核心功能是通過小電流來控制大電流的通斷。它通常包含一個線圈和一組或多組觸點。當給繼電器的線圈施加一定…

MYSQL:庫的操作

文章目錄MYSQL&#xff1a;庫的操作1. 本文簡述2. 查看數據庫2.1 語法3. 創建數據庫3.1 語法3.2 示例3.2.1 創建一個簡單的數據庫3.2.2 使用 IF NOT EXISTS 防止重復創建3.2.3 再次運行&#xff0c;觀察現象3.2.4 查看這個警告到底是什么3.2.5 創建數據庫允許使用關鍵字4. 字符…

Xilinx FPGA XCKU115?2FLVA1517I AMD KintexUltraScale

XCKU115?2FLVA1517I 隸屬于 Xilinx &#xff08;AMD&#xff09;Kintex UltraScale 系列&#xff0c;基于領先的 20?nm FinFET 制程打造。該器件采用 1517?ball FCBGA&#xff08;FLVA1517&#xff09;封裝&#xff0c;速度等級 ?2&#xff0c;可實現高達 725?MHz 的核心邏…

Linux Ubuntu安裝教程|附安裝文件?安裝教程

[軟件名稱]: Linux Ubuntu18.0 [軟件大小]: 1.8GB [安裝環境]: VMware [夸克網盤接] 鏈接&#xff1a;https://pan.quark.cn/s/971f685256ef &#xff08;建議用手機保存到網盤后&#xff0c;再用電腦下載&#xff09;更多免費軟件見https://docs.qq.com/sheet/DRkdWVFFCWm9UeG…

深入解析Hadoop YARN:三層調度模型與資源管理機制

Hadoop YARN概述與產生背景從MapReduce到YARN的演進之路在Hadoop早期版本中&#xff0c;MapReduce框架采用JobTracker/TaskTracker架構&#xff0c;這種設計逐漸暴露出嚴重局限性。JobTracker需要同時處理資源管理和作業控制兩大核心功能&#xff0c;隨著集群規模擴大&#xff…

Pycaita二次開發基礎代碼解析:邊線提取、路徑追蹤與曲線固定

本文將深入剖析CATIA二次開發中三個核心類方法&#xff1a;邊線提取特征創建、元素結構路徑查找和草圖曲線固定技術。通過逐行解讀代碼實現&#xff0c;揭示其在工業設計中的專業應用價值和技術原理。一、邊線提取技術&#xff1a;幾何特征的精確捕獲與復用1.1 方法功能全景ext…

Linux 任務調度在進程管理中的關系和運行機制

&#x1f4d6; 推薦閱讀&#xff1a;《Yocto項目實戰教程:高效定制嵌入式Linux系統》 &#x1f3a5; 更多學習視頻請關注 B 站&#xff1a;嵌入式Jerry Linux 任務調度在進程管理中的關系和運行機制 Linux 內核中的“任務調度”是進程管理系統的核心部分&#xff0c;相互關聯而…

JAVA后端開發—— JWT(JSON Web Token)實踐

1. 什么是HTTP請求頭 (Request Headers)&#xff1f;當你的瀏覽器或手機App向服務器發起一個HTTP請求時&#xff0c;這個請求并不僅僅包含你要訪問的URL&#xff08;比如 /logout&#xff09;和可能的數據&#xff08;請求體&#xff09;&#xff0c;它還附帶了一堆“元數據&am…

【SVM smote】MAP - Charting Student Math Misunderstandings

針對數據不平衡問題&#xff0c;用調整類別權重的方式來處理數據不平衡問題&#xff0c;同時使用支持向量機&#xff08;SVM&#xff09;模型進行訓練。 我們通過使用 SMOTE&#xff08;Synthetic Minority Over-sampling Technique&#xff09;進行過采樣&#xff0c;增加少數…

repmgr+pgbouncer實現對業務透明的高可用切換

本方案說明 PostgreSQL repmgr&#xff1a;實現主從自動故障檢測與切換&#xff08;Failover&#xff09;。PgBouncer&#xff1a;作為連接池&#xff0c;屏蔽后端數據庫變動&#xff0c;提供透明連接。動態配置更新&#xff1a;通過repmgr組件的promote_command階段觸發腳本…

查找服務器上存在線程泄露的進程

以下是一個改進的命令&#xff0c;可以列出所有線程數大于200的進程及其PID和線程數&#xff1a; find /proc -maxdepth 1 -type d -regex /proc/[0-9] -exec sh -c for pid_dir dopid$(basename "$pid_dir")if [ -f "$pid_dir/status" ]; thenthreads$(aw…

Facebook 開源多季節性時間序列數據預測工具:Prophet 飽和預測 Saturating Forecasts

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 Prophet 是一種基于加法模型的時間序列數據預測程序&#xff0c;在該模型中&#xff0c;非線性趨勢與年、周、日季節性以及節假日效應相匹配。…