【Rails2.3】SELECT以外のDB操作をロギングする方法

ログレベルをdebugにすると実行SQLが出力されますが
production環境のログとして出力したいという要件は、
お仕事で使う場合には、あったりするんじゃないでしょうか?

やり方

productionのログレベルをwarnとし、
info/warnでDMLを出力、debug時にはSELECTを含めて(通常通り)出力するには、下記でできました。

#config/environments/production.rb
config.log_level = :warn
#config/environment.rb
module ActiveRecord
  module ConnectionAdapters
    class AbstractAdapter
      def log_info(sql, name, ms)
        if @logger
          return if (!@logger.debug? && sql.match(/^SELECT/))
          name = '%s (%.1fms)' % [name || 'SQL', ms]
          @logger.warn(format_log_entry(name, sql.squeeze(' ')))
        end
      end
    end
  end
end

ポイント

@logger.debug?
return if (!@logger.debug? && sql.match(/^SELECT/))


一見分かりにくいのですが、
@logger.debug?はdebugより下のログレベルを検出するメソッドです。
実際には、下のレベルが無いので合致するのはdebugのみになります。
@logger.warn?だと、debug/info/warnであればtrueが返ります。

DEBUG   = 0
INFO    = 1
WARN    = 2
ERROR   = 3
FATAL   = 4
UNKNOWN = 5
@logger.warn

@logger.warnは、中でaddを呼んでいて
ここで出力制御されています。
なので、ここはお好きなログレベルで出力してあげてください。

#addの中
return if @level > severity

元ソース

#activerecord-2.3.11/lib/active_record/connection_adapters/abstract_adapter.rb
module ActiveRecord
  module ConnectionAdapters
    class AbstractAdapter
      def log_info(sql, name, ms)
        if @logger && @logger.debug?
          name = '%s (%.1fms)' % [name || 'SQL', ms]
          @logger.debug(format_log_entry(name, sql.squeeze(' ')))
        end
      end