GKE中Rails应用的Stackdriver日志功能无法正常工作
Rails 4.2 + Stackdriver 0.15.0:日志无法正确投递到GKE对应命名空间的排查记录
最近维护一个基于Ruby 2.3.6、Rails 4.2.6的应用,搭配Stackdriver 0.15.0做日志收集时遇到了棘手的问题——按官方文档配置后,日志完全没出现在Stackdriver控制台里。
初始配置与问题现象
我已经把stackdriver gem添加到了Gemfile,也在Rails配置里开启了日志功能:
config.google_cloud.use_logging = true config.log_level = :debug
但不管是应用运行时的自动日志,还是我进入容器执行bundle exec rails console,手动调用Rails.logger.error "this is a log message"生成的日志,在Stackdriver里都找不到踪迹。
第一次排查:定位到命名空间不匹配
为了搞清楚问题,我在控制台打印了日志实例的详情:
pp Rails.logger
结果发现监控资源的配置存在错误:
@resource= #<Google::Cloud::Logging::Resource:0x0000558b075d1f50 @labels={:cluster_name=>"onehq-cluster", :namespace_id=>"default"}, @type="container">
我的容器明明运行在staging命名空间,但日志被投递到了default命名空间,难怪我看不到——找错了日志存放的位置!
尝试手动配置后的新问题
既然找到了根源,我尝试手动指定监控资源的配置:
config.google_cloud.logging.monitored_resource.type = "container" config.google_cloud.logging.monitored_resource.labels = { cluster_name: "my-cluster", namespace_id: "staging" }
结果却更糟了——手动生成的日志直接消失了,连default命名空间里都找不到了。
最终发现与解决方案计划
后来排查相关问题记录后发现,这个问题是因为GKE容器没有自动设置用来识别命名空间的环境变量导致的,而且该问题已经被修复,但我的集群还未同步到修复后的版本。
目前我的解决思路是:在应用的部署文件里强制设置对应的环境变量,让Stackdriver日志客户端能正确识别容器所在的staging命名空间,确保日志投递到正确的位置。
内容的提问来源于stack exchange,提问作者Kris Cottingham
相关产品推荐
相关产品推荐

