LPG日志采集框架

采用Loki Promtail Grafana作为整个框架构成

Promtail采集日志数据,Loki接收前一步日志数据并解析存储,Grafana将数据呈现出来

所有的程序都通过docker-compose构建

下面是docker-compose.yaml

services:
  # 日志存储解析
  loki:
    image: grafana/loki:3.5
    container_name: loki
    restart: always
    volumes:
      - /docker-data/loki/data:/loki
      - /docker-data/loki:/etc/loki/
    command: -config.file=/etc/loki/loki.yml
    ports:
      - "2900:2900"
    network_mode: bridge
    hostname: loki

  # 日志采集
  promtail:
    image: grafana/promtail:3.5
    container_name: promtail
    restart: always
    volumes:
      # Promtail 的“游标”文件,保证重启后不会重复采集
      - /docker-data/promtail/promtail-positions:/var/lib/promtail/positions
      # 将需要收集的日志所在目录挂载到promtail容器中
      - /opt/logs/:/var/log/
      - /docker-data/promtail:/etc/promtail/
    # 修改promtail默认配置文件路径
    command: -config.file=/etc/promtail/promtail.yml
    network_mode: bridge
    hostname: promtail
    
  # 日志查询
  grafana:
    image: grafana/grafana:12.0.0
    container_name: grafana
    restart: always
    privileged: true
    user: root
    ports:
      - "3000:3000"
    volumes:
      - /docker-data/grafana/data:/var/lib/grafana
    network_mode: bridge
    environment:
      - TZ=Asia/Shanghai
    hostname: grafana

通过访问IP:3000进入Grafana,在数据源处配置Loki数据源IP:2900默认是3100端口,因冲突换了端口号

以下是配置文件

loki.yml

auth_enabled: false

server:
  http_listen_port: 2900

common:
  instance_addr: 127.0.0.1
  path_prefix: /loki
  storage:
    filesystem:
      chunks_directory: /loki/chunks
      rules_directory: /loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

limits_config:
  # 提高速率限制
  ingestion_rate_mb: 16           # 从 4MB 提高到 16MB
  ingestion_burst_size_mb: 32     # 突发大小提高到 32MB
  max_entries_limit_per_query: 10000
  retention_period: 744h          # 31天保留期

schema_config:
  configs:
    - from: 2020-10-24
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h

ruler:
  alertmanager_url: http://localhost:9093

promtail.yml

配置中job_name可以多个配置,__path__为容器内的/var/log目录,上一步在启动容器时挂载了宿主机的日志文件目录到容器中,所以直接扫描容器中目录即可

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://192.168.1.5:2900/loki/api/v1/push # 与Loki的IP和端口保持一致,其余不变
    tenant_id: fake  # 如果使用多租户,保持与错误中一致

    # 批次配置优化
    batchsize: 1024              # 减少批次大小
    batchwait: 1s                # 增加等待时间
    timeout: 30s                 # 增加超时时间

    # 重试配置
    backoff_config:
      min_period: 100ms
      max_period: 10s
      max_retries: 5

scrape_configs:
- job_name: ycm-logs
  static_configs:
  - targets:
      - localhost
    labels:
      job: ycm-logs
      __path__: /var/log/**/*.log