デバッグ用にメソッドの呼び出し元(スタックトレース)をログに出力する方法
ちょっとした小ネタ。 Ruby スクリプトをデバッグするときに、あるメソッドがどこから呼び出されたのかを知りたいときがある。 普通ならデバッガとブレークポイントを使えばいいんだろうけど、 CGI で動作するスクリプトなどでデバッガが使えないときもある。
そんなときは、メソッド内で意図的に例外を発生させ、即座に例外をキャッチすればいい。 キャッチした例外オブジェクトの backtrace メソッドを呼び出せば、メソッドの呼び出し元を調べることができる。
def some_method begin raise Exception.new rescue Exception => e STDERR.puts e.backtrace.join(", ") end # ここから関数本体 end
このサンプルは CGI を想定しているので、標準エラー出力にスタックトレースを書き出している(Apache HTTP サーバの場合は、 error_log で読むことができる)。 ちなみに、改行ではなくカンマで連結しているのは、余計なデータが付与されるのを防ぐため。 改行で連結すると、スタックトレースの一行ごとに、 error_log の整形情報(日付、ログレベル、リファラ)が付与されてしまう。