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

當有新版本時, 更新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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM