limitusus’s diary

主に技術のことを書きます

ログファイルに出力

問題が合ったときにコンソールだけでなくファイルにもエラーログを出力したいときのこと。
例外の投げ方は前書いたものと同じようにしておく。

その下にファイルにもエラーログを書く部分を示す。

def user(input_data)
    begin
        # 入力値が適正かチェック
        raise Exception, %[データ(#{input_data})が不正] if not valid(input_data)
    rescue Exception => message
        error(message.to_s)
    end
    # 以下通常処理・・・
end

def error(mes)
    # エラー出力ファイル指定
    Ramaze::Log.loggers << Ramaze::Logging::Logger::Informer.new('logfile.txt')
    # エラーとしてログを残す
    Ramaze::Log.error(mes)
    # Ramaze::Log.debug(mes)
    # Ramaze::Log.warn(mes)
    # 以下適当にエラー処理する
end

Ramaze本家には

Ramaze::Log.loggers << Ramaze::Informer.new(__DIR__/:logs/"ramaze_#{Time.now.strftime('%Y%m%d%H%M%S')}.log")

このようなことが書かれているのだが、これだとRamaze::Informerがないと言われてしまう。

実際に/var/lib/gems/1.8/gems/ramaze-2008.06/lib/ramaze/log/informer.rb(Ubuntu 8.04)を見てみると分かるが、構造が違うため、上記コードのように書かなければならないらしい。

9/4 追記

実際に動かしてから気づいたのですが、

Ramaze::Log.loggers << Ramaze::Informer.new(__DIR__/:logs/"ramaze_#{Time.now.strftime('%Y%m%d%H%M%S')}.log")

はstart.rbに書いておくべきのようです。

MainController#errorに書いておくと毎回新しくファイルが生成されるor書き潰されることになります。

start.rbに書いておけば

$ ruby start.rb

を実行した時刻でファイルが開かれっぱなしとなるため、予期したログの取り方ができました。