2015-09-08 8 views
8

デフォルトでは、Railsロガーは実行後のSQLを表示します。ときには、主にクエリの実行に時間がかかる場合があります。実行する前にSQLを出力するようにロガーを構成する必要があります。その後、データベースが応答した後にフォローアップログを追加できます。Railsクエリーが起こる前にログに記録する方法は?

Railsのは、このような2つの段階にSQLログを破るように設定することができますどのように
10:01:01 POST Load Executing "SELECT * from posts;' 
10:01:03 POST Load 1712ms 

基本的な考え方は次のようなものでしょうか?

答えて

3

を出力するようにロガーを設定して、を実行する前に標準的な方法はありません。

でも、ActiveRecord::LogSubscriberクラスを拡張することで、このようにクエリをログに記録できます。

# initializers/extensions/active_record_logger.rb 
module Extensions 
    module ActiveRecordLogger 
    IGNORE_PAYLOAD_NAMES = ActiveRecord::LogSubscriber::IGNORE_PAYLOAD_NAMES 

    # ActiveRecord::LogSubscriber doesn't implement this method. 
    # This method will be invoked before event starts processing. 
    # It's exactly we are looking for! 
    def start(name, id, payload) 
     super 

     return unless logger.debug? 
     return if IGNORE_PAYLOAD_NAMES.include?(payload[:name]) 

     name = payload[:name] 
     sql = payload[:sql] 

     name = color(name, nil, true) 
     sql = color(sql, nil, true) 

     debug "STARTING #{name} #{sql}" 
    end 
    end 
end 

ActiveRecord::LogSubscriber.include Extensions::ActiveRecordLogger 

今、あなたは実行前にクエリログを取得します。例えば、

User.find 1 

を照会する

STARTING User Load SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 
#<User id: 1, username: "dimakura", created_at: "2015-09-08 13:16:42", updated_at: "2015-09-08 13:16:42"> 
を生成します
2

explainのレール方法を検索していると思います。だから、あなたがそのような何かを実装する必要があります:あなたは、タイマーを追加することができ、もちろん

@query = Some.model.query 
Rails.logger @query.explain 
ActiveRecord::Base.silence do 
    @query.load 
end 
Rails.logger "Finished" 

を起こし、例外処理et.c.

関連する問題