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

如何配置Grafana Alloy将容器外日志发送至Loki?

问题解决步骤

根源分析

  1. Loki连接失败:容器内的localhost:3100指向Alloy容器自身,而非Loki容器,导致连接拒绝。
  2. 日志采集失败:宿主机~/logs目录未挂载到Alloy容器内,Alloy无法读取外部日志文件。

1. 修正Docker Compose配置

将宿主机日志目录挂载到Alloy容器,并确保Alloy与Loki处于同一Docker网络(容器间可通过服务名通信)。修改后的关键配置片段:

services:
  alloy:
    image: grafana/alloy:latest
    volumes:
      # 挂载宿主机日志目录到容器内(容器内路径可自定义)
      - ~/logs:/var/log/external_logs
      # 挂载Alloy配置文件
      - ./alloy-local-config.yaml:/etc/alloy/config.alloy
    networks:
      # 复用Loki所在的网络(默认Docker Compose自动创建的网络即可)
      - loki-network
    command: run --config.file=/etc/alloy/config.alloy

  loki:
    image: grafana/loki:latest
    networks:
      - loki-network
    # 保留原有其他配置...

2. 修正Alloy配置文件(alloy-local-config.yaml)

配置日志采集路径为容器内的挂载路径,并将Loki推送地址改为容器服务名loki:3100:

# 采集外部日志文件
local.file_match "external_prices_logs" {
  path_targets = [
    { __path__ = "/var/log/external_logs/prices_logs*" }
  ]
  # 添加自定义标签,方便Grafana筛选
  labels = { job = "external_prices", env = "demo" }
}

# 处理日志条目,提取文件名作为标签
loki.process "format_external_logs" {
  forward_to = [loki.write.push_to_loki.receiver]
  source_labels = ["__path__"]
  action {
    replace {
      source = "__path__"
      expression = ".*/(.*)"
      replacement = "$1"
      target_label = "filename"
    }
  }
}

# 推送日志到Loki
loki.write "push_to_loki" {
  endpoint {
    url = "http://loki:3100/loki/api/v1/push"
  }
}

3. 验证与重启服务

  1. 重启Docker Compose服务:
docker-compose down && docker-compose up -d
  1. 检查Alloy日志,确认无连接错误:
docker-compose logs alloy
  1. 在Grafana中查询日志,使用标签筛选:{job="external_prices"}

额外注意事项

  • 确保宿主机~/logs目录权限允许容器读取:执行chmod 755 ~/logs调整权限
  • 若日志文件滚动生成,Alloy会自动监听新文件,无需额外配置
  • 验证Loki服务可用性:
docker-compose exec alloy curl http://loki:3100/ready

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:19:49