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)