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
當有新版本時, 更新plugins
docker plugin disable loki --force docker plugin upgrade loki grafana/loki-docker-driver:latest --grant-all-permissions docker plugin enable loki systemctl restart docker
對於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",
"loki-pipeline-stages": "- multiline:\n firstline: '^\[\d{2}:\d{2}:\d{2} \w{4}\]'\n" }, "registry-mirrors": ["https://registry.docker-cn.com"] }
記得把YOUR_IP換成loki所在主機的IP,一般都是本機的局域網地址,如果loki映射的端口換了記得這里也需要換。鏡像倉庫地址也可以換成自己雲服務的。
其中max-size表示日志文件最大大小,max-file表示最多10個日志文件,都是對單個容器來說的, multiline是配置多行識別(默認最多128行),轉為單行, firstline表示單條日志的首行正則表達式
我的是 [03:00:32 INFO] 開頭這種格式,所以對應正則是^\[\d{2}:\d{2}:\d{2} \w{4}\] 按照你自己的日志開頭編寫對應正則替換即可
然后重啟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"
loki-pipeline-stages: |
- multiline:
firstline: '^\[\d{2}:\d{2}:\d{2} \w{4}\]'
注意:max-size和max-file這里需要加引號 multiline已經在上文解釋過了就不再贅述了
對於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"
loki-pipeline-stages: |
- multiline:
firstline: '^\[\d{2}:\d{2}:\d{2} \w{4}\]'
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文檔

然后是時間段選擇

注意:Serilog默認日志格式是 "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}" 其中日志等級是3位,loki識別不到,最好是4位,所以需要把Level:u3改為u4
后續應該是loki增加緩存以優化查詢速度和集群配置(k8s)
