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数据源,并保存。

image

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

image

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

 

posted @ 2025-09-28 16:15  高佳丰  阅读(125)  评论(0)    收藏  举报