You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:构建含Selenium集群、Loki与Grafana的Docker日志方案

问题:将Selenium节点日志接入Grafana(Docker Compose + Loki + Promtail)

需求:通过Docker Compose部署Selenium Hub、Chrome节点、Grafana、Loki和Promtail,实现将Selenium节点的执行日志展示在Grafana中。以下是当前配置文件,需排查问题并修复。


现有配置文件

docker-compose.yml

version: "3"
services:
  chrome:
    image: seleniarm/node-chromium
    deploy:
      replicas: 1
    shm_size: 4gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_MAX_SESSIONS=3
      - SE_NODE_OVERRIDE_MAX_SESSIONS=true
      - SE_ENABLE_TRACING=true

  selenium-hub:
    image: seleniarm/hub
    container_name: selenium-hub
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"
    environment:
      - SE_ENABLE_TRACING=true
      - GRID_MAX_SESSION=18
      - GRID_BROWSER_TIMEOUT=240
      - GRID_TIMEOUT=240


  promtail:
    image: grafana/promtail:2.2.0
    ports:
      - "9080:9080"
    volumes:
      - ./promtail-config:/etc/promtail
    command: -config.file=/etc/promtail/config.yml

  loki:
    image: grafana/loki:1.4.1
    ports:
      - "3100:3100"
    volumes:
      - /MyProjectOutsideTheNodes/Config/loki:/etc/loki
    command: -config.file=/etc/loki/local-config.yaml

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_EXPLORE_ENABLED=true
      - GF_LOGS_DATASOURCE=loki
    depends_on:
      - loki

volumes:
  esdata:
        driver: local

Promtail配置(config.yml)

server:
  http_listen_port: 9080

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push  # Use the service name "loki" as the URL

scrape_configs:
  - job_name: docker-containers
    pipeline_stages:
      - docker: {}
    static_configs:
      - targets:
          - chrome-1   # Use the service names as targets
          - firefox
          - selenium-hub
        labels:
          job: varlogs
          host: $HOSTNAME
          __path__: /var/log/*.log

Loki配置(local-config.yaml)

auth_enabled: false

server:
  http_listen_port: 3100

ingester:
  lifecycler:
    address: 127.0.0.1
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 5m
  chunk_retain_period: 30s
  max_transfer_retries: 0

schema_config:
  configs:
    - from: 2018-04-15
      store: boltdb
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 168h

storage_config:
  boltdb:
    directory: /tmp/loki/index

  filesystem:
    directory: /tmp/loki/chunks

limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h

chunk_store_config:
  max_look_back_period: 0s

table_manager:
  retention_deletes_enabled: false
  retention_period: 0s

问题排查与修复方案

1. 核心问题:Promtail无法正确抓取Selenium容器日志

当前Promtail配置用static_configs指定/var/log/*.log,但Selenium容器的日志是输出到stdout/stderr,由Docker统一管理(存储在宿主机/var/lib/docker/containers/**/*.log),而非容器内部的/var/log目录。需调整Promtail配置和挂载:

修改Promtail配置(config.yml)

替换为Docker服务发现自动抓取容器日志,只过滤Selenium相关容器:

server:
  http_listen_port: 9080

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:
  - job_name: selenium-logs
    docker_sd_configs:
      - host: unix:///var/run/docker.sock
        refresh_interval: 10s
    relabel_configs:
      # 只保留Selenium相关容器(hub、chrome节点)
      - source_labels: [__meta_docker_container_name]
        regex: .*(selenium-hub|chrome).*
        action: keep
      # 把容器名作为标签
      - source_labels: [__meta_docker_container_name]
        target_label: container
      # 把服务名作为标签
      - source_labels: [__meta_docker_service_name]
        target_label: service
    pipeline_stages:
      - docker: {}

修改docker-compose.yml中Promtail的挂载

添加Docker socket和容器日志目录的只读挂载,让Promtail能访问Docker元数据和日志文件:

promtail:
  image: grafana/promtail:2.2.0
  ports:
    - "9080:9080"
  volumes:
    - ./promtail-config:/etc/promtail
    - /var/run/docker.sock:/var/run/docker.sock:ro
    - /var/lib/docker/containers:/var/lib/docker/containers:ro
  command: -config.file=/etc/promtail/config.yml

2. 版本兼容性问题:Loki与Promtail版本不匹配

Loki 1.4.1和Promtail 2.2.0版本差距过大,存在API不兼容问题,需统一版本。建议升级Loki到2.2.0(或同系列稳定版):

loki:
  image: grafana/loki:2.2.0
  ports:
    - "3100:3100"
  volumes:
    - ./loki-config:/etc/loki
    - loki-data:/tmp/loki
  command: -config.file=/etc/loki/local-config.yaml

同时更新Loki的配置(适配2.2.0版本,简化配置):

auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

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

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

ruler:
  alertmanager_url: http://localhost:9093

3. 持久化与其他优化

  • Loki的存储目录/tmp/loki会在容器重启后丢失日志,需添加持久化卷:
    在docker-compose.yml的volumes部分添加:
    volumes:
      esdata:
        driver: local
      loki-data:
        driver: local
    
  • 给Selenium服务添加自定义标签,方便Promtail更精准过滤(可选):
    比如给chrome服务添加:
    chrome:
      # ... 其他配置
      labels:
        logging: "selenium"
    
    然后在Promtail的relabel_configs中添加:
    - source_labels: [__meta_docker_container_label_logging]
      regex: selenium
      action: keep
    

4. Grafana配置验证

启动所有服务后,访问http://localhost:3000(默认账号admin/admin),检查Loki数据源是否已自动配置(通过GF_LOGS_DATASOURCE=loki环境变量),若未配置则手动添加:

  • 数据源类型选择Loki
  • URL填写http://loki:3100
  • 保存并测试连接,然后进入Explore页面即可查询Selenium的日志。

内容的提问来源于stack exchange,提问作者vesssori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 04:22:33