Loki¶
概述¶
Loki 是 Grafana Labs 開發的日誌聚合系統,設計哲學與 Prometheus 一脈相承:僅為日誌建立標籤索引,而不對日誌內容進行全文索引。因此 Loki 比 Elasticsearch 等傳統日誌方案更節省資源,特別適合在 Kubernetes 或 Docker 環境中收集容器日誌。它與 Promtail(日誌採集器)及 Grafana(視覺化介面)緊密整合,形成完整的「採集 → 聚合 → 查詢 → 展示」鏈路。本機部署中,我們使用了 grafana/loki:3.7.3 鏡像,並透過 container inspect 確認容器實際掛載與網絡配置,而非依賴 compose 檔案。
架構¶
Loki 由數個邏輯元件組成,可單一進程運行,亦可分散式部署:
- Promtail:負責從檔案、stdout 等來源收集日誌,加入標籤後推送至 Loki。
- Distributor:接收 Promtail 送來的日誌,驗證並將其複製到多個 Ingester。
- Ingester:將日誌暫存在記憶體,累積到一定大小或時間後寫入物件儲存(如 MinIO、S3 或本機磁碟)。
- Querier:處理查詢請求,從 Ingester 及長期儲存中擷取資料,並執行 LogQL 運算。
- Compactor:定期合併索引與 chunk,刪除已過期的資料,執行保留策略。
查詢路徑為:Grafana 發送 LogQL → Querier → Ingester / 儲存 → 回傳結果。因為 Loki 只索引標籤,查詢時會先篩選標籤,再掃描對應 chunk,這使操作成本隨標籤數目而非日誌內容膨脹。
部署¶
本機沒有使用 Docker Compose,改用直接執行容器並以 docker inspect 檢查實況:
docker run -d --name loki \
--network cf_network \
-p 3100:3100 \
-v /srv/loki/config:/etc/loki \
-v /srv/loki/data:/loki \
grafana/loki:3.7.3 \
-config.file=/etc/loki/loki-config.yaml
由於容器加入 cf_network(即 Cloudflare Tunnel 所用的 Docker 網絡),Grafana 和 Promtail 亦在同一網絡內,可直接透過服務名稱 loki:3100 存取,不需對外暴露連接埠。若需執行查詢,可使用 Grafana、HTTP API 或 CLI。
部署時建議將配置檔掛載至唯讀路徑,資料目錄另以 volume 持久化。grafana/loki:3.7.3 為官方鏡像,內建預設配置,但生產環境務必自訂區塊儲存與保留時間。
配置¶
Loki 的設定檔採用 YAML。本機使用的核心配置摘要如下:
auth_enabled: false
server:
http_listen_port: 3100
schema_config:
configs:
- from: 2025-01-01
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: loki_index_
period: 24h
storage_config:
filesystem:
directory: /loki/chunks
compactor:
working_directory: /loki/compactor
retention_enabled: true
limits_config:
retention_period: 168h
這裡使用 tsdb 索引及 filesystem 儲存,適合單機環境;若規模增長可改接物件儲存。retention_period 設為 7 天,Compactor 會定期刪除舊 chunk,避免磁碟無止境膨脹。
Promtail 的設定則需指定 scrape_configs,例如從 Docker socket 收集所有容器日誌:
scrape_configs:
- job_name: docker
docker_sd_configs:
- host: unix:///var/run/docker.sock
relabel_configs:
- source_labels: ['__meta_docker_container_name']
target_label: 'container'
如此便可自動偵測新容器,並將其名稱加入標籤,方便在 Grafana 中按容器篩選。
維運與監控¶
Loki 本身透過 /metrics 暴露 Prometheus 格式指標,例如 loki_ingester_chunks_stored_total、loki_request_duration_seconds 等。我們可讓 Prometheus 抓取這些數據,並在 Grafana 建立儀表板,監看寫入吞吐、查詢延遲、磁碟使用量等。常見告警包括:
- Ingester 記憶體使用率過高:可能是 chunk 未即時 flush,應調整
chunk_target_size或chunk_idle_period。 - Query 逾時:可提高
query_timeout,但同時要檢查 LogQL 是否過度使用正則表達式。 - 磁碟剩餘空間低:需檢查
retention_period是否設定無效,或 Compactor 未正常執行。
維運時亦應定期檢查容器日誌,確認 Loki 沒有重複 error 或 panic。使用 docker logs loki 可快速查看啟動過程及錯誤堆疊。
常見問題¶
1. Promtail 有日誌但 Loki 查不到?
首先檢查 Promtail 的 positions.yaml,確認已正確讀取檔案;其次在 Grafana Explore 中查看標籤是否匹配。常見原因是 Promtail 的 job_name 與 Loki 的標籤選擇器不一致。
2. 查詢很慢,怎麼辦?
善用標籤縮小掃描範圍,例如加上 container="nginx"。可調整 limits_config.max_query_length 或增加 parallel_query_workers。若 chunk 過多,也可增加 chunk_target_size 降低索引數量。
3. 磁碟空間快速成長?
檢查 compactor.retention_enabled 是否為 true,以及 retention_period 是否生效。亦需排除是否有大量高基數標籤(例如 container ID)產生過多 chunk。
4. Loki 容器無法啟動,顯示配置錯誤?
以 -config.file=... 明確指定配置檔路徑,並使用 docker inspect 檢查 mount 權限。Loki 預設運行於非 root 使用者,掛載目錄需允許 uid:10001 寫入。
相關鏈接¶
來源¶
自動生成(2026-08-19 容器覆蓋率補完第二批)