ログレベルを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