Ошибка ротации журнала JRuby on Rails - PullRequest
2 голосов
/ 07 ноября 2011

У нас есть приложение JRuby on Rails 2, развернутое на Tomcat с использованием стандартного регистратора Rails.Через некоторое время после того, как мы пересекли границу DST, мы обнаружили, что приложение было мертвым со следующими сообщениями об ошибках в журналах:

org.jruby.rack.RackInitializationException: Shifting failed. '/tc_instance/applogs/search.log.20111106' already exists.

Обычно журналы вращаются в полночь.Журналы предыдущего дня всегда имеют конечную метку времени 23:59, , за исключением журнала 6 ноября, который имел метку времени 22: 59.

-rw-rw-rw-  300683179 Nov  3 23:59 search.log.20111103
-rw-rw-rw-  226082012 Nov  4 23:59 search.log.20111104
-rw-rw-rw-  79789353 Nov  5 23:59 search.log.20111105
-rw-rw-rw-  109080879 Nov  6 22:59 search.log.20111106

Итак, что случилось, это журналыпопытался перевернуться в 11 вечера вместо полуночи.Затем, когда он пытался создать журналы нового дня, он использовал ту же дату.

Возможно, возникла проблема с нашей конфигурацией или ошибка в логике синхронизации ротации журналов.

Вот соответствующий раздел environment.rb:

  # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
  # Run "rake -D time" for a list of tasks for finding time zone names.
  config.time_zone = 'UTC'

  if defined?($servlet_context)
    include_class java.lang.System
    app_logs_path = System.getProperty("appLogsPath")
    if app_logs_path.nil?
      Rails.logger.error("***System Property 'appLogsPath' was not set.  Please contact the system administrator immediately!")
    else
      config.logger = Logger.new("#{app_logs_path}/search.log", "daily")
      config.logger.formatter = Logger::Formatter.new
      config.logger.datetime_format = "%Y-%m-%d %H:%M:%S"
      config.logger.level = Logger::Severity::WARN
      def config.format_message(severity, timestamp, progname, msg)
        "[#{timestamp.to_formatted_s(:db)} #{severity}] #{msg}\n"
      end

    end
  end

Я предполагаю, что параметр config.time_zone 'UTC' предназначен для ActiveRecord, но мне интересно, является ли это причиной здесь.

Мой вопрос: в чем может быть проблема?Кроме того, где логика синхронизации вращения журнала?Это в Rails, Jruby-Rack или в базовом механизме логов?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Может показаться, что это ошибка в JRuby (http://jira.codehaus.org/browse/JRUBY-6191), которая влияет на режим 1.8. Временные решения: использовать режим 1.9 или использовать гем 'logger'.

Обновление : команда JRuby указала, что на самом деле это логгер в MRI Ruby 1.8.7, который демонстрирует эту ошибку. Для совместимости они не изменят это поведение. Вышеупомянутые обходные пути применяются (и, кажется, работают правильно).

0 голосов
/ 14 ноября 2011

Tomcat обычно использует log4j, который часто требует последних штрихов, чтобы все прошло гладко.

Ознакомьтесь с лучшими практиками:

* Очевидно, немного по-другому, но не проверено, но выглядит полезным. Это может убить вашу собаку и съесть ваших детей, поэтому, пожалуйста, вносите любые изменения с осторожностью.

...