1. 程式人生 > 實用技巧 >docker容器使用loki收集日誌

docker容器使用loki收集日誌

docker-compose安裝loki套件(loki+promtail+grafana)

loki進行日誌聚合處理 類似elk中的es

promtail是日誌收集,類似elk中的logstash filebeat等,如果是隻收集docker容器的日誌則可以用loki的docker plugin替代

grafana是日誌顯示,類似elk中的kibana,可以通過各種標籤和表示式過濾顯示日誌

docker-compose.yml內容如下

version: "3"

networks:
  loki:
  
services:
  loki:
    image: grafana/loki
restart: always environment: - TZ
=Asia/Shanghai - LANG=zh_CN.UTF-8 ports: - 3100:3100 networks: - loki promtail: image: grafana/promtail
restart: always environment: - TZ
=Asia/Shanghai - LANG=zh_CN.UTF-8 networks: - loki grafana: image: grafana/grafana:master
restart: always environment: - TZ
=Asia/Shanghai - LANG=zh_CN.UTF-8 ports: - 3000:3000 networks: - loki

如果只用docker plugin來收集日誌則可以把promtail部分刪除,已經有grafana的也可以直接複用

安裝loki的docker plugin

命令列執行

docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions

對於loki的docker plugin有兩種使用方式。

  • 配置daemon.json,收集此後建立的所有容器的日誌(注意,是配置daemon.json後重啟docker服務後建立的容器才會把日誌輸出到loki)。
  • 新建容器時指定logging型別為loki,這樣只有指定了logging的容器才會輸出到loki

全域性收集配置

編輯daemon.json。linux下預設路徑是/etc/docker/daemon.json (需要sudo), windows則預設是%userprofile%\.docker\daemon.json

{
  "log-driver": "loki",
  "log-opts": {
    "loki-url": "http://YOUR_IP:3100/loki/api/v1/push",
    "max-size": "50m",
    "max-file": "10"
  },
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

記得把YOUR_IP換成loki所在主機的IP,一般都是本機的區域網地址,如果loki對映的埠換了記得這裡也需要換。映象倉庫地址也可以換成自己雲服務的。

其中max-size表示日誌檔案最大大小,max-file表示最多10個日誌檔案,都是對單個容器來說的。

然後重啟docker服務。

sudo systemctl restart docker

在此之後建立的容器預設都會把日誌傳送到loki。

如果不全域性配置,而只想特定的容器進行日誌收集,則根據啟動容器的方式,有兩種配置方法。

docker run配置日誌輸出到loki

通過docker run啟動容器,可以通過--log-driver來指定為loki。示例如下

docker run --rm --name=grafana --log-driver=loki --log-opt loki-url="http://YOUR_IP:3100/loki/api/v1/push" --log-opt max-size=50m --log-opt max-file=10 grafana/grafana
--log-driver=loki指定日誌驅動器為loki
--log-opt loki-url則指定了loki的url
--log-opt max-size日誌最大大小
--log-opt max-file日誌檔案最大數量

docker-compose 配置日誌輸出到loki

docker-compose 小於3.4可以對需要日誌輸出的配置新增配置如下

logging:
  driver: loki
  options:
    loki-url: "http://YOUR_IP:3100/loki/api/v1/push"
    max-size: "50m"
    max-file: "10"

注意:max-size和max-file這裡需要加引號

對於3.4極其以上版本可以通過定義模板來減少程式碼量

version: "3.4"

x-logging:
  &loki-logging
  driver: loki
  options:
    loki-url: "http://YOUR_IP:3100/loki/api/v1/push"
    max-size: "50m"
    max-file: "10"

services:
  host:
    container_name: grafana
    image: grafana/grafana
    environment:
    - TZ=Asia/Shanghai
    - LANG=zh_CN.UTF-8
    logging: *loki-logging

&loki-logging表示定義模板

*loki-logging表示引用模板。對於多個服務就只需要對應加上一行logging: *loki-logging 即可。相比之前的版本可謂是大大簡化了

Grafana顯示和過濾日誌

一開始安裝的時候將grafana對映到了宿主機的3000埠,所以地址就為 http://YOUR_IP:3000

grafana預設使用者名稱密碼是admin和admin

第一次進入需要修改admin的密碼

新增loki資料來源

選擇loki。

因為一開始安裝grafana和loki是在一個docker-compose裡,所以預設在同一個子網下,因此可以url可以直接寫http://loki:3100。如果grafana和loki是分開的,則需要改為填loki所在的宿主機ip

點選 儲存和測試 。會提示連結成功。

檢視過濾日誌

左側選單欄選擇探索

label裡有對應選項可以選擇。 compose_project就是docker-compose的專案名 compose_service就是其中的服務名 container_name就是容器名。這幾個基本就夠我們定位到具體的某個容器了。

關鍵字查詢 |~ "keyword" 文件連結:LogQL文件

然後是時間段選擇

後續應該是loki增加快取以優化查詢速度和叢集配置(k8s)