2010-08-14 3 views
81

나는 스택 추적을 기록하는 올바른 방법을 찾아 내려고 노력해 왔습니다. 나는 this 링크를 발견했는데 logger.error $ !, $ !. backtrace은 갈 길이지만 작동하지 않습니다. log_error 않습니다. 레일즈 루비가 사용하는 하나의 인수만을 받아들이 기 때문에 어쨌든 오류 메쏘드에 두 번째 인수를 전달하는 것이 문서화대로 어떻게되는지 알지 못합니다.레일 : 예외의 전체 스택 추적 로깅

이상하게도 (또는 아닐지라도) 두 번째 주장은 통역사의 불만없이 받아 들여집니다. 그러나 내가 전달하는 것은 무시됩니다.

내가 누락 된 내용을 누구든지 설명 할 수 있습니까? 오류에 대한 두 번째 주장이 무엇이며 무엇을 먹고 있는가에 대한 통찰력?

답변

164

ActiveSupport에서 BufferedLogger 클래스의 소스를 보면 두 번째 인수가 'progname'이라는 것을 알 수 있습니다. 첫 번째 인수가 nil이고 블록을 지정하지 않았거나 블록이 true가 아닌 값을 반환 한 경우에만 사용됩니다.

본질적으로 추가 매개 변수를 출력하기 위해 두 번째 매개 변수를 사용할 수 없습니다. , 역 추적의 각 라인을 통해 반복과 별도로 특정 로거를 인쇄하는 것이 좋습니다 수 있습니다 당신은 당신의 로깅을 설정 한 방법에 따라

begin 
    raise 
rescue => e 
    logger.error e.message 
    logger.error e.backtrace.join("\n") 
end 

: 당신이 원하는 무엇

은 더 가깝다 뭔가이다 개행 문자를 출력하지 마십시오. 다음과 같이하면됩니다 :

+0

감사합니다. 나는 이전 stackoverflow 대답에 의해 혼란스러워했다. –

+5

크로스 플랫폼 호환성을 유지하기 위해 "\ r \ n"을 사용하여 가입합니다. –

+4

대신 플랫폼 간 호환이 가능하도록'$ /'를 사용하지 않겠습니까? '\ r \ n'은 소수의 플랫폼에만 한정되어 있으므로 루비가 처리하도록하십시오. – vgoff