跳轉至

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_totalloki_request_duration_seconds 等。我們可讓 Prometheus 抓取這些數據,並在 Grafana 建立儀表板,監看寫入吞吐、查詢延遲、磁碟使用量等。常見告警包括:

  • Ingester 記憶體使用率過高:可能是 chunk 未即時 flush,應調整 chunk_target_sizechunk_idle_period
  • Query 逾時:可提高 query_timeout,但同時要檢查 LogQL 是否過度使用正則表達式。
  • 磁碟剩餘空間低:需檢查 retention_period 是否設定無效,或 Compactor 未正常執行。

維運時亦應定期檢查容器日誌,確認 Loki 沒有重複 errorpanic。使用 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 容器覆蓋率補完第二批)