最近使っているRailsのデバッグ方法

会社ではdebuggerあたりが結構人気。pryも結構人気。
なんだけど、自分はdebuggerはあまり好きじゃあない。pryは微妙。
自分がdebuggerを使わない理由は、debugger自体がRubyの内部に入り込みすぎていて、過去にはこれのせいでまともに動かなかったとか、環境によってはインストールがコケるとかも理由だったりします。


残りはprintデバッグかloggerを使うのが手っ取り早いのですが、loggerは本番用に仕込むのは有りですがデバッグで使うのは結構めんどくさい。何よりコードが結構汚くなってあまり好きじゃあないです。
となるとprintデバッグ。今どきprintデバッグというのも何なのですが自分のような古手のプログラマには結構これが楽ですし、無駄な事をしなくても良くてお手軽です。


ただ、Railsでprintデバッグを行うと、困ったことにRails自体が出す表示にまぎれて分かりづらい。
という時に見つけたのがこの記事 2014年1月現在の俺のRailsデバッグ方法 - komagataのブログ
このPowを使えばログが分離するので、結構便利に使っていたのですが、Mac以外だと動かないのが辛い。hoofというのがあるらしいですがPowより若干使いづらい印象。
あと、社内DNSの関係で結構めんどくさいことに。


なので最近は自前でちょっと細工しています。
config/initializers/debug.rb というファイルを作っています。

module Kernel
  def puts(*arg)
    return if Rails.env.production?

    path = Rails.root.join('log').join("debug.log")
    File.open(path, 'a') do |f|
      arg.each do |str|
        f.write(str+"\n")
      end
    end
  end

  def p(*arg)
    return if Rails.env.production?

    path = Rails.root.join('log').join("debug.log")
    File.open(path, 'a') do |f|
      arg.each do |str|
        f.write(str.inspect+"\n")
      end
    end
  end
end


これだといつものputsとpを使うと、log/debug.logに出るので結構分かりやすい。
出力を色々改造すれば、時間を付与したり好きに出来ます。あとは'tail -f log/debug.log'すればいいだけ。
本番ではきちんとloggerを使ったほうが良いとは思いますが、開発中ならこれで十分。