loki收集容器日志
Loki介绍
Loki 是 Grafana Labs 开源的日志聚合系统,常被称为 “日志界的 Prometheus”。它的设计理念是只索引元数据,不索引完整日志内容,结合 Promtail 和 Grafana,就能实现高效的日志采集、存储与可视化。与传统的 ELK(Elasticsearch + Logstash + Kibana)方案相比,Loki 部署更轻量、存储成本更低,对资源要求小,非常适合与容器和 Kubernetes 环境结合使用。同时,Loki 在查询时依赖标签(labels)过滤,再结合 Grafana 强大的可视化能力,让日志分析更直观灵活。
部署步骤
部署目录
root@test-midware-0001:/data/grafana# ls -l total 12 -rw-r--r-- 1 root root 1614 Sep 23 15:45 docker-compose.yaml -rw-r--r-- 1 root root 424 Sep 23 15:37 loki-config.yaml -rw-r--r-- 1 root root 1508 Sep 23 15:53 promtail-config.yaml drwxr-xr-x 2 root root 6 Sep 28 16:02 promtail-data
本次采用docker-compose的方式部署loki及其相关的组件。以下是详细的docker-compose.yaml文件内容:
version: '3.8' services: loki: image: grafana/loki:2.9.8 container_name: loki ports: - "32100:3100" volumes: - ./loki-config.yaml:/etc/loki/local-config.yaml:ro # 配置挂载 - loki_data:/loki # 存储日志/chunks/index 数据 - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro command: -config.file=/etc/loki/local-config.yaml restart: unless-stopped networks: - grafana-net promtail: image: grafana/promtail:2.9.8 # 最近 stable 的带安全补丁版本 container_name: promtail depends_on: - loki command: -config.file=/etc/promtail/config.yaml -log.level=info volumes: - /var/run/docker.sock:/var/run/docker.sock:ro # promtail需要使用docker API - /data/docker/containers:/var/lib/docker/containers:ro # 日志目录挂载 - ./promtail-config.yaml:/etc/promtail/config.yaml:ro # 配置文件挂载 - ./promtail-data:/tmp # 临时文件挂载,记录日志位置 - /etc/localtime:/etc/localtime:ro # 时区 - /etc/timezone:/etc/timezone:ro user: root restart: unless-stopped networks: - grafana-net grafana: image: grafana/grafana container_name: grafana depends_on: - loki - promtail environment: - GF_SECURITY_ADMIN_PASSWORD=******* #这里设置自己的密码 - GF_AUTH_ANONYMOUS_ENABLED=false # 其他环境变量配置你自己的需求 ports: - "23100:3000" volumes: - grafana_data:/var/lib/grafana - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro restart: unless-stopped networks: - grafana-net volumes: loki_data: grafana_data: networks: grafana-net: external: true
这里有一个需要注意的点是,容器网络需要提前创建好
$ docker network create grafana-net
上面的docker-compose.yaml中有三个容器,分别是grafana,日志展示的UI。Loki日志存储服务端和promtail日志收集端。后面两个需要挂载配置文件,这也得提前编辑好。
root@test-midware-0001:/data/grafana# cat loki-config.yaml auth_enabled: false server: http_listen_port: 3100 common: path_prefix: /loki storage: filesystem: chunks_directory: /loki/chunks rules_directory: /loki/rules replication_factor: 1 ring: kvstore: store: inmemory schema_config: configs: - from: 2020-10-24 store: tsdb object_store: filesystem schema: v13 index: prefix: index_ period: 24h
root@test-midware-0001:/data/grafana# cat promtail-config.yaml server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: # ------------------------------- # 1. Docker 容器日志 # ------------------------------- - job_name: docker-logs docker_sd_configs: - host: unix:///var/run/docker.sock refresh_interval: 5s relabel_configs: # 容器名称(去掉开头的 /) - source_labels: [__meta_docker_container_name] target_label: container_name regex: '/(.*)' replacement: '$1' # 给特定容器(比如名字里包含 ls-device)加标签 project_name=ls-device - source_labels: [__meta_docker_container_name] regex: .*ls-device.* target_label: project_name replacement: ls-device # 容器 ID - source_labels: [__meta_docker_container_id] target_label: container_id # 镜像名称 - source_labels: [__meta_docker_image] target_label: image # 日志路径 - source_labels: [__meta_docker_container_id] target_label: __path__ replacement: /var/lib/docker/containers/$1/*.log pipeline_stages: # 解析 Docker json-file 日志格式 - docker: {} # 将日志的 time 字段作为 timestamp - timestamp: source: time format: RFC3339Nano # 丢弃超过 7 天的旧日志 - drop: older_than: 168h
启动容器
docker-compose up -d
登录grafana
配置Loki数据源,并保存。

再次点击探索就可以查看到我们添加的Loki数据源了

我们可以点击标签过滤,按容器名或者项目名来查找特定的日志。

浙公网安备 33010602011771号