2011-11-07 5 views
2

기본 Rails 로거를 사용하여 Tomcat에 JRuby on Rails 2 응용 프로그램을 배포했습니다. 우리는 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 

그래서 로그가 자정 대신 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 설정을 가정 액티브입니다,하지만 난 그 원인이 여기에있다 궁금해.

제 질문은 : 무엇이 문제 일 수 있습니까? 또한, 로그 회전 타이밍 로직은 어디에 있습니까? 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를 사용합니다. log4j는 종종 부드럽게 진행되기 위해 마무리가 필요합니다.

체크 아웃 몇 가지 모범 사례 :

* 분명히 조금 다른, 검증되지 않은 그러나 유용하게 보입니다. 이것은 개를 죽이고 자녀를 먹을 수 있으므로 변경 사항을 신중하게 배포하십시오.

+0

log4j와 같은 대체 로거로의 전환이 실제로 가능한 해결책 중 하나이므로 현상금을 수여했습니다. –