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

Docker Compose中app服务连接rsyslog日志容器I/O超时问题排查求助

问题根因&修复方案

1. 变量语法误用导致主机名解析错误

你在syslog-address中填写的${syslog-ng}属于Shell参数扩展语法:${VAR-default}的规则是当VAR变量未定义时,返回default作为默认值。由于你没有定义过syslog环境变量,该表达式最终返回值为ng,和报错信息里的lookup ng完全对应,直接导致域名解析失败。

2. Docker日志驱动的网络限制

Docker的日志驱动运行在宿主机的Docker Daemon进程中,默认无法解析Docker Compose内部网桥的服务名,直接写服务名syslog-ngDaemon无法识别对应服务。

3. 配置项不匹配&缺失

  • application服务的depends_on字段填的是logging,但你的syslog服务名为syslog-ng,依赖配置完全不生效
  • syslog-ng服务没有暴露514端口,外部进程/Daemon无法访问

修复步骤

第一步:修改docker-compose.yml配置

调整后的配置参考如下:

# docker-compose.yml
version: '3.9'
services:
  # Svc 1
  application:
    build:
      context: ./app
      dockerfile: Dockerfile
    container_name: gopkg
    logging:
      driver: syslog
      options:
        # 本地测试用宿主机地址+映射端口,后续接入Traefik时替换为Traefik的UDP负载入口地址即可
        syslog-address: "udp://127.0.0.1:514"
        tag: gopkg
    depends_on:
      - syslog-ng
  # Svc 2
  syslog-ng:
    build:
      context: ./syslog
      dockerfile: Dockerfile
    container_name: syslog-ng
    # 暴露UDP 514端口给Docker Daemon访问
    ports:
      - "514:514/udp"

第二步:验证效果

重新执行docker-compose up -d启动服务,进入syslog-ng容器查看/var/log/messages,即可看到application服务发送的日志。

第三步:后续水平扩容适配

待你部署多实例rsyslog+Traefik负载时,仅需要把syslog-address中的地址替换为Traefik负责承接syslog流量的UDP入口地址即可,无需修改应用和rsyslog的内部配置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:45:03