如何配置Grafana Alloy将容器外日志发送至Loki?
问题解决步骤
根源分析
- Loki连接失败:容器内的
localhost:3100指向Alloy容器自身,而非Loki容器,导致连接拒绝。 - 日志采集失败:宿主机
~/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. 验证与重启服务
- 重启Docker Compose服务:
docker-compose down && docker-compose up -d
- 检查Alloy日志,确认无连接错误:
docker-compose logs alloy
- 在Grafana中查询日志,使用标签筛选:
{job="external_prices"}
额外注意事项
- 确保宿主机
~/logs目录权限允许容器读取:执行chmod 755 ~/logs调整权限 - 若日志文件滚动生成,Alloy会自动监听新文件,无需额外配置
- 验证Loki服务可用性:
docker-compose exec alloy curl http://loki:3100/ready
内容的提问来源于stack exchange,提问作者Mauro Ghiglia
相关产品推荐
相关产品推荐

