2011-11-07 5 views
2

デフォルトのRailsロガーを使用して、JRuby on Rails 2アプリケーションをTomcatにデプロイしました。私たちは、DSTの境界を越えた後、我々はアプリケーションを発見したいくつかの時間は、ログに次のエラーメッセージで死んでいた:JRuby on Railsログローテーションエラー

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 

だから何が起こったことはログが23時の​​代わりに、真夜中にロールオーバーすることを試みました。その後、新しい日付のログを作成しようとしたときに、同じ日付を使用していました。

私たちの設定に問題があるか、ログ回転タイミングロジックにバグがあるようです。

ここ

は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、または基本的なロギングの仕組みですか?

答えて

2

JRuby(http://jira.codehaus.org/browse/JRUBY-6191)のバグで、1.8モードに影響するようです。回避策は、1.9モードを使用するか、 'logger' gemを使用することです。

更新:JRubyチームは、このバグを示すのは実際にはMRI Ruby 1.8.7のロガーであると指摘しました。互換性のために、この動作は変更されません。上記の回避策が適用されます(正しく動作するようです)。

+0

よろしいですか。ありがとう。あなたのメールIDを共有することをマークしてください –

0

通常、Tomcatはlog4jを使用します。これはしばしば円滑に進むために仕上げが必要です。

いくつかのベストプラクティスをチェックアウト:

*明らかに少し異なって、テストされていないしかし、役に立つと思う。これはあなたの犬を殺して子供を食べる可能性がありますので、変更を配慮して配備してください。

+0

log4jのような代替ロガーへの切り替えは実際に可能な解決策であるため、私はあなたに賞金を授与しました。 –

関連する問題