Как мне заставить Rails регистрировать временные метки в часовом поясе UTC?

#ruby-on-rails #ruby #ruby-on-rails-3 #logging

#ruby-on-rails #ruby #ruby-on-rails-3 #ведение журнала

Вопрос:

Как мне заставить Rails печатать временные метки журнала в UTC вместо localtime? В настоящее время он печатает

 Started GET "/" for 190.176.185.42 at 2013-08-21 18:27:56 -0400
 

Это упростит поиск ошибок, о которых сообщают пользователи. Я видел это http://apidock.com/rails/Logger и попробовал

production.rb

   Rails.logger.datetime_format = "%Y-%m-%d %H:%M:%S %Z"
 

но это выдало ошибку

 undefined method `datetime_format=' for nil:NilClass (NoMethodError)
 

Я не думаю, что простая настройка формата будет работать. Я думаю, что сначала мне нужно преобразовать время в UTC.

Rails 3.2.14.

Комментарии:

1. Проблема в том, что ваш регистратор nil . Почему это так?

2. Я не знаю. Он находится в production.rb. Возможно, он еще не инициализирован. Где я должен разместить эту строку? Это правильная строка для использования?

3. Вероятно, это так, попробуйте сделать Rails.logger = ActiveSupport::Logger.new('wherever_the_log_goes.log') .

Ответ №1:

Эта строка журнала генерируется started_request_message . Кажется, его трудно изменить, потому что он жестко запрограммирован на использование формата по умолчанию. Возможно, вам придется переопределить этот метод для ваших целей.

Ответ №2:

Да, это сработало! Используя информацию Yanhao в нижней части production.rb,

 Rails::Rack::Logger.class_eval do
  # Override logging to spit out UTC time 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.utc ]
  end
end