我们在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
我假设config.time_zone设置为'UTC'是针对ActiveRecord的,但我想知道这是否是原因。
我的问题是:可能是什么问题?另外,日志旋转时序逻辑在哪里?它是在Rails,Jruby-Rack还是底层的日志记录机制中?
答案 0 :(得分:2)
似乎JRuby(http://jira.codehaus.org/browse/JRUBY-6191)中存在影响1.8模式的错误。解决方法是使用1.9模式或使用'logger'gem。
更新:JRuby团队指出它实际上是MRI Ruby 1.8.7中的记录器,它表现出这个bug。为了兼容性,它们不会更改此行为。上述解决方法适用(并且似乎正常工作)。
答案 1 :(得分:0)
Tomcat通常使用log4j,这通常需要完成触摸以顺利进行。
查看一些最佳做法:
http://jedschneider.posterous.com/rails-application-specific-logging-on-tomcat *
Logging with log4j on tomcat jruby-rack for a Rails 3 application *
*显然有点不同,未经测试看起来很有用。这可能会杀死你的狗并吃掉你的孩子所以请小心部署任何改变。