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

如何为生产环境下的Rails应用配置Google Cloud Logging

理想配置方案

问题核心是默认的RAILS_LOG_TO_STDOUT配置直接替换了Rails的logger实例,导致Stackdriver gem无法注入其日志处理逻辑。我们需要保留STDOUT输出的同时,让Stackdriver接管日志管理,以下是两种可行方案:

方案一:让Stackdriver包装现有STDOUT Logger

修改production.rb中的日志配置代码,将Stackdriver的日志器作为上层包装,保留原有STDOUT输出:

config.log_formatter = ::Logger::Formatter.new

if ENV["RAILS_LOG_TO_STDOUT"].present?
  # 创建基础STDOUT Logger
  base_logger = ActiveSupport::Logger.new(STDOUT)
  base_logger.formatter = config.log_formatter
  tagged_logger = ActiveSupport::TaggedLogging.new(base_logger)
  
  # 用Stackdriver日志器包装基础Logger,同时保留STDOUT输出
  config.logger = Stackdriver::Logging::Logger.new(tagged_logger)
end

这样配置后,日志会同时输出到STDOUT和Stackdriver Cloud Logging,既满足本地/容器查看日志的需求,又能让Stackdriver捕获结构化日志。

方案二:直接让Stackdriver接管Logger并配置STDOUT输出

直接配置Stackdriver作为Rails的默认Logger,并指定其输出到STDOUT,同时保留必要的结构化日志支持:

# 提前加载Stackdriver模块
require "stackdriver"

# 配置Stackdriver日志服务
Stackdriver::Logging.configure do |config|
  config.service_name = "你的应用名称"
  config.service_version = "你的应用版本"
  # 指定输出到STDOUT
  config.logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT))
  # 可选:如果需要兼容原有日志格式,设置formatter
  config.logger.formatter = ::Logger::Formatter.new
end

# 让Rails使用Stackdriver的Logger
config.logger = Stackdriver::Logging.logger

这种方式更直接,完全由Stackdriver管理日志生命周期,同时保证STDOUT输出正常。

注意事项

  • 移除原有配置后日志无法显示,是因为Stackdriver默认仅将日志发送到Cloud Logging,不会自动输出到STDOUT,所以必须手动配置其输出流。
  • 确保stackdriver gem已正确安装并在Gemfile中包含(gem "stackdriver")。

内容的提问来源于stack exchange,提问作者Steven Barragán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:10:45