web-dev-qa-db-ja.com

Ruby例外のトレース全体をデフォルトのRailsロガーを使用して記録するにはどうすればよいですか?

私はRailsプロジェクトに取り組んでおり、例外をRailsログファイルに記録するために取得しようとしています。logger.error $!例外の最初の行をファイルに記録します。ただし、トレーススタック全体もログに記録したいと思います。デフォルトのRails loggerを使用して、例外のトレース全体をログに記録するにはどうすればよいですか?

37
Josh Moore
logger.error $!.backtrace

また、できることを忘れないでください

rescue ErrorType => error_name

エラーにデフォルト以外の変数名を付けるには$!

39
Ian Terrell

方法Railsはそうです

137             logger.fatal(
138               "\n\n#{exception.class} (#{exception.message}):\n    " +
139               clean_backtrace(exception).join("\n    ") +
140               "\n\n"
141             )

248       def clean_backtrace(exception)
249         if backtrace = exception.backtrace
250           if defined?(Rails_ROOT)
251             backtrace.map { |line| line.sub Rails_ROOT, '' }
252           else
253             backtrace
254           end
255         end
256       end
18
Matt Burke

Railsの以降のバージョンでは、RAIL_ROOT/config/initializers/backtrace_silencers.rbの次の行のコメントを外します(または、このファイルがない場合は、このファイル自体を追加します)。

# Rails.backtrace_cleaner.remove_silencers!

これにより、例外時にログに完全なバックトレースが書き込まれます。これはv2.3.4で機能します。

10
mxgrn

logger.error caller.join("\n")がうまくいくはずです。

6
Redbeard

Railsでは、ActionController::Rescueが扱います。私のアプリケーションコントローラーアクションでは、このモジュールのメソッドlog_errorを使用して、ログのバックトレースをきれいにフォーマットしています:

def foo_action
  # break something in here
rescue
  log_error($!)
  # call firemen
end
4
Priit

ここに私がそれをする方法があります:

http://Gist.github.com/127708

Exception#backtraceのriドキュメントは次のとおりです。

http://Gist.github.com/12771

Kernel#callerを使用することもできます。これにより、完全なトレース(現在のフレームを除く)も提供されます。

http://Gist.github.com/127709

また、all例外をキャッチしようとしている場合は、RuntimeErrorではなく、Exceptionからレスキューする必要があります。

3
user52804

次のように、Rubyのデフォルト変数を使用することもできます。

logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"
1
user3223833