【问题标题】:Heroku logging not workingHeroku 日志记录不起作用
【发布时间】:2011-12-27 06:13:16
【问题描述】:

我在 Heroku Cedar 上部署了一个 rails 3.1 应用程序。我的日志记录有问题。默认的 Rails 日志运行良好,但是当我执行以下操作时:

logger.info "log this message"

在我的控制器中,Heroku 不记录任何内容。当我部署我的应用程序时,我看到了 heroku 消息“Injecting rails_log_stdout”,所以我认为调用记录器应该可以正常工作。将语句最终放入我的日志中。我还尝试过其他日志级别,例如 logger.error。没有任何效果。有没有其他人看过这个?

【问题讨论】:

标签: heroku ruby-on-rails-3.1 cedar


【解决方案1】:

@MBHNYC 正确解决的问题是您的日志不会进入 STDOUT。

Heroku 提供了一个gem,而不是手动配置所有这些东西,它可以为您完成所有这些工作。

随便放

gem 'rails_12factor', group: :production

在您的 Gemfile 中,bundle,就是这样!

注意:这适用于 Rails 3 和 4。

来源:Rails 4 on Heroku

【讨论】:

  • 天哪,谢谢你。只是浪费了一天的调试时间,因为我将这个 gem 分组到错误的环境中,所以日志没有显示出来。
【解决方案2】:

MBHNYC 的答案效果很好,但是在不更改代码的情况下很难在不同的环境中更改日志级别。您可以在 environments/production.rb 中使用此代码来尊重环境变量以及合理的默认值:

# https://github.com/ryanb/cancan/issues/511
config.logger = Logger.new(STDOUT)
config.logger.level = Logger.const_get((ENV["LOG_LEVEL"] || "INFO").upcase)

使用此命令设置不同的日志级别:

heroku config:set LOG_LEVEL=error

【讨论】:

  • 优秀的菲尔,这是一个出色的解决方案。
  • 我已将其修改为upcase,然后将其传递给const_get,这是区分大小写的。否则,如果将 LOG_LEVEL 变量设置为小写值,您可能会从 Heroku 收到错误:2012-12-05T21:38:14+00:00 app[worker.1]: wrong constant name debug
  • It seems that Heroku removed reverences to LOG_LEVEL from their docs within a month or so of this answer。目前,这样做似乎会更好:config.log_level = ENV['LOG_LEVEL'] ? ENV['LOG_LEVEL'].to_sym : :info
  • @user664833:我已经更新了答案以明确 LOG_LEVEL 不再受到 Heroku 的任何特殊处理。将其设置为符号而不是常量有什么好处?我倾向于更喜欢我的答案是“我在生产中得到的”,所以我知道它们有效,但我现在很好奇。
  • @PhilCalvin,在 Rails 中 4 默认 config/environments/production.rb 使用符号 (config.log_level = :info),所以我也照做了。出于个人喜好,我发现我之前评论中的代码看起来更干净。而upcase的大小写和使用现在也是遗物。此外,在 Rails 4 中,您可能会使用 rails_12factor,这取决于 rails_stdout_logging,它确保您的日志将发送到标准输出。请注意,rails_stdout_logging 也支持 Rails 3
【解决方案3】:

目前看来,heroku 在构建 slug 时注入了这两个插件:

rails_log_stdout - https://github.com/ddollar/rails_log_stdout

rails3_server_static_assets - https://github.com/pedro/rails3_serve_static_assets

发送到预先存在的 Rails 记录器的任何内容都将被丢弃,并且不会在日志中可见。只需添加此内容以供其他任何最终来到这里的人使用。

【讨论】:

  • 错了。 Heroku 所做的是将自己的输出转储到标准输出。这就是为什么你应该将你的 rails 也设置为转储到标准输出中
  • 澄清一下,您认为我所说的哪一部分是错误的?是的,heroku 将输出发送到标准输出。该插件通过将记录器替换为记录到标准输出的记录器来解决此问题。在将记录器替换为原始 Rails 记录器之前记录的任何内容将永远不可见。
  • 抱歉,目前我不确定这一切是如何运作的。顺便说一句,您在回答中提到的插件不是 Heroku 当前注入的插件
【解决方案4】:

我只是遇到了同样的问题,通过使用这里的技术解决了:

https://github.com/ryanb/cancan/issues/511

基本上,您需要将记录器输出指定到 STDOUT,一些 gem 会干扰记录器并似乎劫持了功能(在我的情况下是 cancan)。

对于点击懒惰,只需将其放在 environment/production.rb 中

config.logger = Logger.new(STDOUT) 
config.log_level = :info

【讨论】:

  • Heroku 支持将我引向了类似的方向。以下是他们声称导致此问题的 gem 列表:acts_as_audited、on_the_spot、restful_jsonp、authlogic、cancan、simple-navigation
  • 第二行应该是config.logger.level = Logger::INFO
猜你喜欢
  • 2021-11-19
  • 2018-08-24
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多