JRuby on Rails 日志轮换失败

Posted

技术标签:

【中文标题】JRuby on Rails 日志轮换失败【英文标题】:JRuby on Rails log rotation failure 【发布时间】:2011-11-07 17:51:03 【问题描述】:

我们在 Tomcat 上部署了一个 JRuby on Rails 2 应用程序,使用默认的 Rails 记录器。在我们越过 DST 边界一段时间后,我们发现应用程序已死,日志中显示以下错误消息:

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

原木通常在午夜轮换。前一天的日志的最终时间戳始终为 23:59,除了11 月 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

我假设 'UTC' 的 config.time_zone 设置是针对 ActiveRecord 的,但我想知道这是否是原因。

我的问题是:可能是什么问题?另外,日志轮换时序逻辑在哪里?是在 Rails、Jruby-Rack 还是底层的日志机制中?

【问题讨论】:

【参考方案1】:

这似乎是影响 1.8 模式的 JRuby (http://jira.codehaus.org/browse/JRUBY-6191) 中的一个错误。解决方法是使用 1.9 模式或使用“记录器”gem。

更新:JRuby 团队指出,实际上是 MRI Ruby 1.8.7 中的记录器出现了这个错误。为了兼容性,他们不会改变这种行为。上述解决方法适用(并且似乎工作正常)。

【讨论】:

【参考方案2】:

Tomcat 通常使用 log4j,通常需要最后润色才能顺利进行。

查看一些最佳实践:

http://juliusdavies.ca/logging.html#rotate

http://jedschneider.posterous.com/rails-application-specific-logging-on-tomcat *

Logging with log4j on tomcat jruby-rack for a Rails 3 application *

* 显然有点不同,未经测试但看起来很有用。这可能会杀死您的狗并吃掉您的孩子,因此请谨慎部署任何更改。

【讨论】:

切换到诸如 log4j 之类的备用记录器确实是一种可能的解决方案,所以我奖励了你。

以上是关于JRuby on Rails 日志轮换失败的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 生产日志轮换

管理/删除/轮换/流式传输 Elastic Beanstalk 日志

sh JRuby on Rails开发的jruby流浪盒的基本设置

Jruby on rails 是如何加载jar包的

PostgreSQL 日志轮换大小达到文件限制

Ruby On Rails 3.1 中的尾随日志文件