一、Loki 簡介
云原生可觀測三大支柱
支柱 | 工具 | 用途 |
---|---|---|
Metrics | Prometheus | 性能趨勢、系統負載 |
Logs | Loki | 原始事件記錄、錯誤診斷 |
Traces | Tempo / Jaeger | 分布式鏈路追蹤 |
一、Loki 簡介
1.1 Loki 是什么
Loki 是由 Grafana Labs 開發的 日志聚合系統,與 Prometheus 架構一致,主打“標簽驅動(label-based)日志管理”,并與 Grafana 緊密集成。
1.2?Loki 的優勢:
-
類似 Prometheus 的標簽模型。
-
不做全文索引,成本低。
-
與 Promtail、Grafana 緊密協作。
-
支持結構化日志查詢與聚合分析。
二、Loki 架構與組件
2.1 架構示例
+-------------+| Grafana | <---> LogQL 查詢+------+------+ | +-----v-----+ +-----------------+| Loki |<--| Object Storage |+-----+-----+ +-----------------+^+--------+--------+| Promtail / Fluentbit |+--------------------+
2.2 Loki 模塊角色
組件 | 說明 |
---|---|
Promtail | 日志收集 Agent,自動附加 Kubernetes 標簽 |
Loki | 存儲、索引日志元數據,只索引 Labels |
Grafana | 可視化查詢,支持 Metrics + Logs 聯動 |
Ruler | 告警規則引擎(LogQL-based alert) |
?
三、日志采集與標簽管理最佳實踐
3.1 推薦采集方式
-
Kubernetes 場景推薦使用
Promtail
DaemonSet,讀取:/var/log/pods/<namespace>_<pod>/*.log
3.2 標簽管理策略(重點 🔥)
建議標簽選擇的三原則:
-
低基數:如
namespace
,app
,pod
,container
。 -
穩定性:避免標簽頻繁變動,如動態 IP。
-
唯一性避免:不要將
trace_id
?作為標簽!
配置示例(Promtail):
pipeline_stages:- docker: {}- labels:job: my-appenvironment: production
四、LogQL 查詢實踐
4.1 基礎語法
{job="nginx"} |= "error"
-
{...}
:標簽過濾(必須) -
|= "xxx"
:精確包含 -
|~ "xxx"
:正則匹配 -
!=
,!~
:負向過濾
4.2 聚合語法
count_over_time({job="api"} |= "timeout" [5m])
聚合函數列表:
函數 | 說明 |
---|---|
count_over_time | 日志數量統計 |
rate | 日志行的變化速率(類似 Prometheus) |
avg_over_time | 提取數字后的平均值(結合 line_format ) |
sum by (...) | 標簽維度聚合 |
?
4.3 結構化日志解析
{app="svc"} | json | level="ERROR" and request_id!="null"
或者使用正則提取:
{app="svc"} |~ "(?P<status>\\d{3}) (?P<path>/api/[^ ]+)"
五、告警策略與 LogQL
Loki 支持通過 Ruler + Alertmanager 進行日志級別的告警設置。
5.1 規則示例(YAML)
groups:
- name: error-alertsrules:- alert: HighErrorRateexpr: |rate({app="nginx"} |= "error" [5m]) > 10for: 1mlabels:severity: criticalannotations:summary: "High error rate detected"
5.2 告警推薦實踐
-
告警表達式盡量使用
rate
,避免瞬時波動。 -
盡量避免基于高基數字段告警。
六、Grafana 可視化與聯動
6.1 日志 → 指標 → Trace 的聯動
-
在日志行中提取 trace_id,實現與 tracing系統?的點擊跳轉。
-
通過
Explore
標簽頁可按 TraceID 聚合多維度觀測。
6.2 日志儀表板設計建議
面板類型 | 示例內容 |
---|---|
表格面板 | 最近 N 條錯誤日志 |
時間序列圖 | error 頻次? |
直方圖 | 各服務日志量分布 |
鏈接跳轉 | 指向 Trace 或外部監控平臺 |
?
七、性能優化建議
7.1 采集優化
-
控制
scrape_interval
,避免 Promtail 頻繁讀取。 -
開啟
batchsize
,batchwait
進行日志緩沖。
7.2 存儲優化
-
使用 MinIO / S3 存儲 Chunk,減少本地磁盤壓力。
-
配置
retention
自動清理歷史日志(如 7 天)。
7.3 查詢優化
-
控制查詢時間窗口,避免
[1h]
級別的大窗口。 -
使用
label_values
或metric name
縮小搜索空間。
八、示例場景匯總(最佳實踐)
場景 | 查詢語句 |
---|---|
統計每分鐘內 error 次數 | rate({app="web"} |
查詢最近 10 分鐘內返回 500 的請求日志 | {status="500"} |
提取 json 字段中 level=ERROR | {app="svc"} |
按 pod 維度聚合異常日志速率 | sum by(pod) (rate({app="api"} |
trace_id 跳轉 | {job="frontend"} |
?
九、總結:Loki + LogQL 的可觀測性價值
能力 | 實現 |
---|---|
低成本日志存儲 | 僅索引標簽,不做全文索引 |
標簽驅動的快速查詢 | 類似 Prometheus 的語法體驗 |
與指標/鏈路天然融合 | 與 Prometheus / skywarking等配合打造統一觀測平臺 |
結構化日志支持好 | 支持 JSON/正則解析字段 |
易于擴展與高可用部署 | Helm + Shipper + ObjectStore 架構可彈性部署 |
?
資料:
LogQL: Log query language | Grafana Loki documentation
?