2012-07-19 1 views
11

하나의 요청을 따르고 그 다음을 수행 할 수 있도록 멋지게 정렬 된 로그 파일을 얻는 것을 생각합니다.Rails 3.2.2 로그 파일 정렬이 잘못됨, 요청이 뒤틀림

이제 4 년 된 "all scroggled up"이라는 로그 파일은 더 이상 별개의 텍스트 덩어리가 아니라는 것을 의미합니다. 두 요청의 로깅은 서로 얽히고/섞이게됩니다. 예를 들어

:

Started GET /foobar 
... 
Completed 200 OK in 2ms (Views: 0.4ms | ActiveRecord: 0.8ms) 
Patient Load (wait, that's from another request that has nothing to do with foobar!) 
[ blank space ] 
Something else 

나는 하나 개의 요청에서 무슨 일이 일어나고 있는지 알 수 없기 때문에 이것은, 미치게됩니다.

이것은 승객에서 실행됩니다.

+0

나는 관련이 있다고 생각한다. http://news.ycombinator.com/item?id=4483390 – fguillen

답변

3

네가!, 그들은 그래서 기다리지 않고 더 이상이다 ActiveSupport::BufferedLogger의 일부를 변경 한 요청이 로그 플러시 끝날 때까지 :

을하지만, 그들은 매우 재밌는 ActiveSupport::TaggedLogging을 추가했고 우표 모든 로그에 원하는 모든 종류의 표시가 가능합니다.

# config/application.rb 
config.log_tags = [:uuid] 

그런 다음 로그가을 엉망 경우에도 당신은 여전히 ​​해당 그들 중 어느 따를 수 있습니다 : 귀하의 경우

스탬프이 같은 요청 UUID와 로그에 좋은이 될 수 당신이 따라하고있는 요청에.

당신은 당신의 로그 연구에 도움이 기능을 더 재미있는 일을 할 수 있습니다 :

4

같은 대답을 찾으려고했지만 좋은 정보를 찾을 수 없었습니다. 서버 또는 레일 코드를 수정해야하는지 잘 모르겠습니다.

당신이 문제에 대한 자세한 정보를 원하는 경우 여기에 당신이

PassengerMaxInstancesPerApp 1 

구성을 사용할 수 있습니다 다른 모든 이상 생산 로그 가독성을 중시하는 경우 로깅 https://github.com/rails/rails/commit/04ef93dae6d9cec616973c1110a33894ad4ba6ed

4

의 제거 옛날 방식을 커밋합니다. 일부 확장 문제가 발생할 수 있습니다. 또는 당신은 application.rb이 같은 물건 수 :

process_log_filename = Rails.root + "log/#{Rails.env}-#{Process.pid}.log" 
log_file = File.open(process_log_filename, 'a') 
Rails.logger = ActiveSupport::BufferedLogger.new(log_file) 
+2

내가 잘못하지 않았다면, 이전 프로세스의 PID를 얻은 경우 이전 로그 파일을 덮어 쓰게된다. 이것은 빈번한 회전에 의해 어느 정도 완화 될 수 있지만, PID는 당신이 기대할 수있는 것이 아니기 때문에 여전히 100 % 안전하지 않습니다. 로그 파일 이름에 타임 스탬프 또는 뭔가를 추가하려고한다고 생각합니다. 또한 : PassengerMaxInstancesPerApp 제안은 꽤 쓸모 없으며 snarky에 접해 있습니다. 나는 당신의 대답에서 그것을 제거 할 것입니다. –

+6

PassengerMaxInstancesPerApp 변경을 제안해서는 안되기 때문에 나는이 대답을 먼저 인용했습니다. 누군가가 하드 디스크 공간을 비우는 방법을 묻는다면 루트 디렉토리를 삭제하는 코드 줄을 제안하는 것과 비슷합니다. 수정하십시오. – trisweb

+0

PassengerMaxInstancesPerApp는 부분적으로 농담이지만 ​​개발 중에 사용하는 경우 실제 솔루션입니다. –

0

그들은 어떤 준 임의 REQID를 추가하고 하나의 요청에 대한 모든 라인을 작성해야합니다. 이렇게하면 혼란스러워하지 않을 것입니다.

3

글쎄, 나를 위해 TaggedLogging 솔루션은 전혀 이동하지 않습니다, 서버가 심하게 망가질 경우 일부 로그가 손실 될 수 있지만 로그를 완벽하게 정렬해야합니다. 그래서, the issue comments 조언을 다음 내 응용 프로그램이 적용 해요 :

# lib/sequential_logs.rb 
module ActiveSupport 
    class BufferedLogger 
    def flush 
     @log_dest.flush 
    end 
    def respond_to?(method, include_private = false) 
     super 
    end 
    end 
end 

# config/initializers/sequential_logs.rb 
require 'sequential_logs.rb' 

Rails.logger.instance_variable_get(:@logger).instance_variable_get(:@log_dest).sync = false 

를 지금까지 내가이 내 응용 프로그램에 영향을하지 않은 말할 수있다, 그것은 여전히 ​​실행되고 지금 내 로그는 다시 의미를.

0

나는 이것을 사용하지 않았지만, Lumberjack's unit_of_work method이 당신이 찾고있는 것일 수도 있습니다. 전화 :

Lumberjack.unit_of_work do 
    yield 
end 

해당 블록 또는 생성 된 블록에서 수행되는 모든 기록에는 고유 한 ID가 태그로 지정됩니다.