私はRailsプロジェクトに取り組んでおり、例外をRailsログファイルに記録するために取得しようとしています。logger.error $!
例外の最初の行をファイルに記録します。ただし、トレーススタック全体もログに記録したいと思います。デフォルトのRails loggerを使用して、例外のトレース全体をログに記録するにはどうすればよいですか?
logger.error $!.backtrace
また、できることを忘れないでください
rescue ErrorType => error_name
エラーにデフォルト以外の変数名を付けるには$!
。
方法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
Railsの以降のバージョンでは、RAIL_ROOT/config/initializers/backtrace_silencers.rbの次の行のコメントを外します(または、このファイルがない場合は、このファイル自体を追加します)。
# Rails.backtrace_cleaner.remove_silencers!
これにより、例外時にログに完全なバックトレースが書き込まれます。これはv2.3.4で機能します。
logger.error caller.join("\n")
がうまくいくはずです。
Railsでは、ActionController::Rescue
が扱います。私のアプリケーションコントローラーアクションでは、このモジュールのメソッドlog_error
を使用して、ログのバックトレースをきれいにフォーマットしています:
def foo_action
# break something in here
rescue
log_error($!)
# call firemen
end
ここに私がそれをする方法があります:
Exception#backtraceのriドキュメントは次のとおりです。
Kernel#callerを使用することもできます。これにより、完全なトレース(現在のフレームを除く)も提供されます。
また、all例外をキャッチしようとしている場合は、RuntimeErrorではなく、Exceptionからレスキューする必要があります。
次のように、Rubyのデフォルト変数を使用することもできます。
logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"