source

레일: 예외의 전체 스택 추적 기록

lovecheck 2023. 6. 6. 08:29
반응형

레일: 예외의 전체 스택 추적 기록

스택 추적을 기록하는 올바른 방법을 찾고 있습니다.logger.error $!, $!.backtrace가 가는 이지만 log_error가 가는 길은 아니라는 링크를 발견했습니다.설명서에 따르면 레일에서 사용하는 루비 로거는 단일 인수만 허용하기 때문에 오류 방법에 두 번째 인수를 전달하는 것이 어떻게 작동하는지 알 수 없습니다.

이상하게도 (아마도) 두 번째 주장은 통역사의 불평 없이 받아들여집니다.하지만 제가 전달하는 모든 것은 무시됩니다.

누가 제가 무엇을 놓쳤는지 설명해주실 수 있나요?오류에 대한 두 번째 주장이 무엇을 위한 것이고 무엇을 먹는 것인지에 대한 통찰력이 있습니까?

ActiveSupport에서 Buffered Logger 클래스의 소스를 보면 두 번째 인수가 'programname'임을 알 수 있습니다.이 값은 첫 번째 인수가 0이고 블럭을 지정하지 않았거나 블럭이 참이 아닌 값을 반환한 경우에만 사용됩니다.

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

다음과 같은 작업을 수행할 수 있습니다.

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

이게 정답입니다.

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

kuboon의 답변에 따르면 이 로그 형식은 일반적이며 로그 파일의 오류를 분류하는 데 유용합니다.

begin
  raise
rescue StandardError => e
  Rails.logger.error (["#{self.class} - #{e.class}: #{e.message}"]+e.backtrace).join("\n")
end

언급URL : https://stackoverflow.com/questions/3484337/rails-logging-the-entire-stack-trace-of-an-exception

반응형