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

Docker化Rails应用输出到STDOUT时日志重复问题求助

问题(中文翻译)

我将Ruby应用Docker化,通过以下命令启动:

CMD ["rails", "server", "--no-log-to-stdout", "-b", "0.0.0.0", "-p", "80"]

同时在environments/*.rb中配置了如下Logger:

logger = ActiveSupport::Logger.new(STDOUT)
logger.formatter = proc do |severity, datetime, progname, msg|
  message = msg
  message << " from #{progname}" if progname.present?
  content = JSON.dump(timestamp: datetime.to_s, severity: severity, message: message)
  content << "\n"
  content
end

运行应用时出现日志重复输出的异常问题,Ruby on Rails版本为7.1,请问有人遇到过相同问题吗?


Rails 7.1 Docker化日志重复输出的解决办法

日志重复的核心原因是你只创建了自定义Logger,但没有替换Rails的默认Logger,导致默认Logger和自定义Logger同时输出到STDOUT。另外--no-log-to-stdout参数仅控制Rails Server本身的日志输出,不影响Rails框架的全局Logger行为。

解决步骤:

  • 正确替换Rails全局Logger
    你当前的代码只是定义了logger变量,但未赋值给Rails的全局Logger。需要把自定义Logger设置为Rails的默认Logger,修改environments配置文件:

    config.logger = ActiveSupport::Logger.new(STDOUT)
    config.logger.formatter = proc do |severity, datetime, progname, msg|
      message = msg
      message << " from #{progname}" if progname.present?
      content = JSON.dump(timestamp: datetime.to_s, severity: severity, message: message)
      content << "\n"
      content
    end
    # 确保Active Record等组件也使用同一个Logger
    config.active_record.logger = config.logger
    
  • 统一Puma日志配置
    --no-log-to-stdout仅关闭Puma的访问日志输出,若Puma还有其他日志输出,可在config/puma.rb中配置:

    # 关闭Puma额外日志输出,或指向同一自定义Logger
    stdout_redirect '/dev/null', '/dev/null', true
    
  • 排查第三方gem日志
    确认是否有第三方gem独立输出日志到STDOUT,比如监控、调试类工具。可通过临时禁用gem排查是否为第三方组件导致的重复。

不少Rails 7.1用户都遇到过类似问题,主要是对新版本日志配置逻辑不熟悉,未正确覆盖默认Logger导致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:39:59