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
相关产品推荐
相关产品推荐

