Rails : 예외의 전체 스택 추적 로깅


110

스택 추적을 기록하는 올바른 방법을 찾으려고 노력하고 있습니다. 내가 건너 온 그 상태 링크 logger.error을 $! $! 역 추적이 길을 가야하는 것입니다하지만 나를 위해 일을하지 않는 LOG_ERROR 않습니다. 문서에 따르면 레일스에서 ​​사용하는 루비 로거가 단일 인수 만 허용하기 때문에 오류 메서드에 두 번째 인수를 전달하는 방법이 어떻게 작동하는지 알 수 없습니다.

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

아무도 내가 놓친 것을 설명 할 수 있습니까? 오류에 대한 두 번째 주장이 무엇이며 무엇을 먹고 있는지에 대한 통찰력이 있습니까?

답변:


204

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

본질적으로 두 번째 매개 변수를 사용하여 추가 항목을 출력 할 수 없습니다.

당신이 원하는 것은 다음과 같은 것입니다.

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

로깅 설정 방법에 따라 역 추적의 각 줄을 반복하고 특정 로거가 줄 바꿈을 출력하지 않으므로 별도로 인쇄하는 것이 더 좋을 수 있습니다.이 경우 다음과 같은 작업을 수행합니다.

begin
  raise
rescue => e
  logger.error e.message
  e.backtrace.each { |line| logger.error line }
end

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

10
$/플랫폼 간 호환 을 위해 대신 사용 하지 않겠습니까 ? \r\n일부 플랫폼에만 해당하는 것처럼 Ruby가 처리 하도록합니다.
vgoff

12
로거를 여러 번 호출하는 것은 스레드로부터 안전하지 않기 때문에 메시지가 분할되어 읽을 수 없게 될 수 있습니다. 로거 자체는 스레드로부터 안전합니다. 일반적으로 내 메시지를 하나의 문자열로 결합한 다음 기록합니다.
Morozov 2015

시간 로거에서 로그 항목에 지원 줄 바꿈에 따라서 분할을 보이지만 그래, 당신은 아주 잘 그리고 당신은이 방법의 한계를 알고 있어야하지 않았다
darkliquid

+1 @JackWatson은 스레드가 안전하지 않기 때문에 절대적으로 이상한 대답입니다. 우리가 여기서 웹 앱에 대해 이야기하고 있기 때문에 중요합니다
EvAlex

16

이것이 답입니다.

begin
  raise
rescue => e
  logger.error ([e.message]+e.backtrace).join($/)
end

9
구두점 감소 :Rails.logger.error [e.message, *e.backtrace].join($/)
artm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.