为啥 Heroku 使用服务器时间而不是 Rails 时区进行日志记录?

Posted

技术标签:

【中文标题】为啥 Heroku 使用服务器时间而不是 Rails 时区进行日志记录?【英文标题】:Why does Heroku log using the server time rather than the Rails time zone?为什么 Heroku 使用服务器时间而不是 Rails 时区进行日志记录? 【发布时间】:2011-02-12 17:49:51 【问题描述】:

更新:好的,我没有制定一个好的 Q 来回答。我仍然在为 heroku 在 -07:00 UTC 而我在 +02:00 UTC 挣扎。

问:如何将日志写入正确的 Time.zone 中? 9 小时的差异,heroku(美国西部) - 挪威,令人分心。我在我的 production.log 中得到了这个(使用 heroku logs):

将 ProductionController#create 处理为 xml(适用于 2010-04-28 23:00:12 的 81.26.51.35)[POST]

如何让它写2010-04-29 08:00:12 +02:00 GMT

请注意,我在 heroku 上运行,无法自己设置服务器时间,就像在您的亚马逊 EC2 服务器上一样。以下是我之前的问题,我将保留它,因为它包含一些关于时间和区域的有趣信息。


当我在environment.rb 中设置了另一个时区时,为什么Time.now 会产生服务器本地时间

config.time_zone = 'Copenhagen'

我已经把它放在一个视图中

<p> Time.zone <%= Time.zone %> </p>
<p> Time.now <%= Time.now %> </p>
<p> Time.now.utc <%= Time.now.utc %> </p>
<p> Time.zone.now <%= Time.zone.now %>  </p>
<p> Time.zone.today <%= Time.zone.today %> </p>

heroku 上的我的应用上呈现此结果

时区 (GMT+01:00) 哥本哈根

Time.now Mon Apr 26 08:28:21 -0700 2010

Time.now.utc 世界标准时间 4 月 26 日星期一 15:28:21 2010

Time.zone.now 2010-04-26 17:28:21 +0200

Time.zone.today 2010-04-26

Time.zone.now 产生正确的结果。我是否必须在任何地方从Time.now 切换到Time.zone.now?看起来很麻烦。我真的不在乎服务器的当地时间是什么,由于大量使用Time.now,这给我带来了很多麻烦。我是否误解了这里的任何基本内容?

【问题讨论】:

有一个叫做“Rails 时区”的东西让我头疼 @Montagist 有没有一种叫做“Rails 时区”的东西?现实世界有时区,我很高兴我们有这个很棒的库来帮助我们处理它。 【参考方案1】:

如果无法更改实际的服务器时间(我认为您无法在 Heroku 上做到这一点),您唯一的选择就是自己转换时间。

如果Time.zone.now 太麻烦,您可以使用tzinfo gem 设置全球时区:

$tz = TZInfo::Timezone.get("Europe/Oslo")
$tz.now # current time in Norway

但这仍然是您应用中的全局变化,与您正在做的事情没有显着差异。

【讨论】:

你是对的,你不能在 heroku 上更改服务器时间,但这应该没问题。感谢 TZInfo 提示!虽然不涉及日志问题。记录到production.log 是rails 内部代码,所以我想我必须打开它并更改它对Time.now 的使用。 TZInfo 不会影响 Time.now,对吧? 不,使用tzinfo 不应该影响实际的服务器Time【参考方案2】:

在对我自己的 Heroku 时区问题进行进一步调查后,我发现一篇帖子表明您实际上可以使用以下命令在应用程序级别指定时区:

heroku config:add TZ=Europe/Oslo

我相信这可能是您所有烦恼的答案。由http://www.reality.hk/articles/2010/01/07/1319/ 提供(编辑:截至 2012.08.23 的链接已断开。Archived copy。)

【讨论】:

这个配置是否也会影响 heroku 插件数据库? 以防万一其他人追逐它,可以在***上找到时区选项:en.wikipedia.org/wiki/List_of_tz_database_time_zones 还有 rake time:zones:all 会有所帮助 我试过了,但日志的时区没有变化。 我为我工作heroku config:add TZ="America/Sao_Paulo"【参考方案3】:

我发现上述解决方案不适用于 Heroku。 我把它放在我的 config/environments/production.rb 确保在初始化记录器之前放置它

Rails::Rack::Logger.class_eval do
# Override logging to spit out time in different zone to easier find user reported 
errors
# https://github.com/rails/rails/blob/v3.2.14/railties/lib/rails/rack/logger.rb#L38
 def started_request_message(request)
  'Started %s "%s" for %s at %s' % [
    request.request_method,
    request.filtered_path,
    request.ip,
    Time.now.in_time_zone('Melbourne') ]
 end
end

【讨论】:

也许不是,这是一个古老的问题和答案。一个好的解决方案不应该是一个黑客,请不要被它侮辱,你表现出创造力。

以上是关于为啥 Heroku 使用服务器时间而不是 Rails 时区进行日志记录?的主要内容,如果未能解决你的问题,请参考以下文章

Rails Twilio App 在运行时在heroku 中发送文本时挂起,但在heroku 上的rail 控制台中工作(以及在所有环境中的本地)

从 Parse.com 启动 - 为啥 cURL POST 到解析服务器在本地工作而不在 Heroku 上工作?

使用 Windows 机器将 Django 部署到 Heroku(生产服务器而不是开发服务器)

为啥我的 Flask 应用程序在 Heroku 上被检测为 node.js

乘客是不是等同于 Heroku,为啥我仍然需要两者之一?

为啥云代码存储在我的计算机中