@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Log::Minimal インスパイアなロガーのラッパー

弊社は椅子の飛ばない穏やかな社風ですが、ログは重要ですね。しかし logger.info とか何度もタイプするのはめんどいし、時刻とか(超大事!)どこで呼ばれたとか(大事!)を真面目に入れるとロガ―呼び出しが長くなって嫌ですね。なので Log::Minimal っぽく infof とか書けるようにした。

https://gist.github.com/1109108

module Log
  module Minimal
    [:fatal, :error, :warn, :info, :debug].each do |method|
      define_method "#{method}f" do |message|
        time = Time.now.iso8601
        level = method.to_s.upcase
        caller = "%s#%s:%s" % [self.class, action_name, caller(1)[0].scan(/:(\d+):/)]
        
        logger.send(method, "%s [%s] %s %s" % [time, level, caller, message])
      end
    end
  end
end

使い方は gist のコメントにも書いたけど、 log_minimal.rb を lib/ 以下とかに置いて config/environment.rb あたりで require 'log_minimal' しておき、 ApplicationController で include Log::Minimal すると infof とかがはえてアクションのなかで使える。

ログの書式も似せてみた。日付とか呼び出し元の情報も自動的に残るので楽ですね。バックトレースつきの infoff とかも作ってみたけど見づらすぎるのでやめた。あと Rails のログファイルっていちリクエストが複数行にわかれてて空行で区切られるスタイルなのでこういう一行ログが入り込むとちょっとアレなんだけど(ログをパースするプログラムがうまく動かなくなる可能性がある)気になるなら logger を別につくって違うファイルに書くようにしたらいいと思います。