2009-10-21 5 views
7

소수의 액션이 상당한 계산 시간을 필요로하는 Rails 애플리케이션이 있습니다. 이러한 작업을 백그라운드 작업으로 관리하는 복잡한 과정을 거치지 않고 처리를 여러 스레드로 나눌 수 있고 멀티 코어 서버와 함께 JRuby를 사용하면 합리적인 시간에 모든 스레드가 완료되는지 확인할 수 있습니다. (고객은 이미이 접근법을 유지하는 것에 대해 상당한 관심을 보이고 있으며, 백그라운드에서 작업을 수행하고 있습니다.)레일즈 애플리케이션에서 스레드 내부 로깅

문제는이 스레드 내에서 Rails 로거 작성이 작동하지 않는다는 것입니다. 로그 파일에는 아무 것도 나타나지 않습니다. 나는이 문제에 대한 몇 가지 언급을 찾았지만 해결책은 찾지 못했다. 디버깅에 도움이되는 코드를 삽입하는 데는 신경 쓰지 않겠지 만 stdout은 glassfish gem app 서버로 먹을 것 같습니다.

매번 새 로그를 만들지 않고 누구나 Rails 루비 스레드에서 성공적으로 로깅을 했습니까?

+0

업데이트 : 글래스 피시 로그 파일에 스레드가 표시되는 것으로 나타났습니다. 왜 내가 전에 이것을 보지 못했는지 확신 할 수 없다. 나는 원래 다른 스레드 (non-main)가 생성 한 스레드에서이 스레드를 테스트했을 수도 있습니다. 어쨌든, 디버깅 목적으로 로그 파일의 STDOUT에 쓰기가 표시되어 행복합니다. –

답변

4

같은 문제로 머리를 긁적 거리고있었습니다. 내 대답은 다음과 같습니다 :

Thread.new do 
    begin 
    ... 
    ensure 
    Rails.logger.flush 
    end 
end 
+0

좋아 보인다! 감사! –

+0

나를 위해 EM을 사용하여 작동하지 않습니다. – skrat

0

백그라운드 작업에 대한 귀하의 우려를 이해하지만 레일스에서 ​​스레드를 회전시키는 것은 무서운 일일 수 있음을 기억하십시오. 이 프레임 워크는 멀티 스레딩에 대한 조항을 제공하지 않기 때문에 모든 레일스 객체를 스레드로부터 안전하지 않은 것으로 취급해야합니다. 데이터베이스 연결조차도 까다로워집니다.

로거의 경우 : 표준 Ruby 로거 클래스는 스레드로부터 안전해야합니다. 그러나 Rails가이를 사용한다고하더라도 Rails 응용 프로그램이 무엇을하고 있는지를 제어 할 수는 없습니다. 예를 들어, 벤치마킹 메커니즘은 레벨을 전환하여 로거를 "조용히"합니다.

레일 로거 사용을 피할 것입니다. 스레드를 사용하려면 해당 작업에 대한 메시지를 기록하는 스레드 내에 새 로거를 작성하십시오. 각 스레드에 대해 새 로그를 작성하지 않으려는 경우, 각 스레드가 액세스 할 수있는 런타임에 하나의 스레드 안전 로깅 오브젝트를 작성하려고 할 수도 있습니다.

귀하의 장소에서 저는 배경 작업 솔루션을 다시 한 번 살펴볼 것입니다. DRb는 악몽처럼 보이지만 "bj"는 멋지고 쉽게 보입니다. JRuby로 실행하려면 약간의 작업이 필요했습니다. JRuby의 Java 스케줄러를 사용하는 다른 방법도 있습니다. http://www.jkraemer.net/2008/1/12/job-scheduling-with-jruby-and-rails

+0

정보와 제안을 보내 주셔서 감사합니다. 그러나이 시점에서 로깅을 제외하고는 정상적으로 작동하므로 스레딩 방식을 고수하겠습니다. 어떤 스레드에서든 의심스러운 보석/플러그인을 사용하지 않고 있으며 경쟁 조건을 방지하기 위해 뮤텍스를 사용하는 것에 대해주의를 기울이고 있습니다. 레일즈 로거 사용에 대한 관심은 디버깅이 쉬워서 JRUBY_VERSION이 정의되고 다른 코드를 순차적으로 실행하는 경우에만 스레드를 사용하여 해결할 수있었습니다. 어쨌든 고마워! –

관련 문제