【问题标题】:Log issue in Rails4 with Docker running rake taskRails4 中的日志问题,Docker 运行 rake 任务
【发布时间】:2016-04-05 05:33:50
【问题描述】:

我的 rails4 应用程序正在使用 docker 运行。它运行 rake 任务以从 AWS SQS 获取消息。

我遇到的问题是日志无法及时显示在控制台中。在出现异常/错误之前,控制台不会显示任何内容。换句话说,如果我的应用程序运行良好,控制台就不会出现任何日志。但如果应用程序出错,所有的日志(信息、警告和错误)都会聚集在一起!

我已经将 config/production.rb 配置为打击:

config.logger = Logger.new(STDOUT)
config.logger.level = Logger.const_get('INFO')
config.log_level = :info

我在谷歌上搜索“rake 任务日志不起作用”,但没有任何用处。这是 Rails 日志问题还是 rake 任务日志问题,或者可能是 docker 问题?

希望得到一些建议!

【问题讨论】:

  • 我看到了一个类似的问题,在 rake 任务退出之前,我调用的任何 rake 任务都不会输出到 STDOUT。我在 rake 任务中使用以下代码对此进行了测试:loop { puts "in loop"; sleep 2 }。当任务运行时,STDOUT 中不会出现任何内容,但是一旦完成“循环中”的两个实例,就会立即获得输出。我还没有找到为什么会这样,但是如果我弄明白了,我会在这里发回。

标签: ruby-on-rails logging rake-task


【解决方案1】:

尝试禁用对 STDOUT 的输出缓冲。您可以通过将此行添加到您的 rake 任务来做到这一点:

$stdout.sync = true

【讨论】:

  • 这对我有用。请注意,我找到了这个解决方案,因为docker-compose logs -f <container> 的行为就像是为我缓冲的一样,而我从未看到过输出。所以问题出在 Ruby 1.9.3 的输出缓冲(不确定 Ruby 的默认缓冲是否已在以后的版本中修复,但我更喜欢像 PHP 一样始终同步执行所有操作,因为确定性通常比性能更重要,至少在开发期间是这样)。更多信息请访问 github.com/docker/compose/issues/1549github.com/midori-rb/midori.rb/issues/…
  • 忘了说默认值是:$stdin.sync: false, $stdout.sync: false, $stderr.sync: true。虽然我不确定输入缓冲有什么作用。
  • 这也适用于 Rails 3,并且可以放在 development.rb(或您的环境的首选配置文件)中
【解决方案2】:

对于 Rails 4.x,日志级别是配置

# Enable stdout logger
config.logger = Logger.new(STDOUT)

# Set log level
config.log_level = :ERROR

记录器级别从 config.log_level 在记录器实例上设置: (https://github.com/rails/rails/blob/v4.2.4/railties/lib/rails/application/bootstrap.rb#L70)

【讨论】:

  • 谢谢,伙计!但我认为这不会解决我的问题。包括信息、警告和错误在内的日志不会及时显示。它们仅在发生异常时才进入控制台。
  • ENV 配置 # 默认 :ERROR config.log_level = ENV.fetch("LOG_LEVEL", "ERROR") 从 shell 运行测试 # 日志level :INFO (bootstrap.rb 中的值是大写的) $ LOG_LEVEL=info rake test # 日志级别:ERROR $ LOG_LEVEL=debug rake test
猜你喜欢
  • 1970-01-01
  • 2018-06-21
  • 2010-10-09
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 2012-05-30
相关资源
最近更新 更多