Profit
- verbose_query_logs = true でない環境でrails serverのログが少し追いやすくなる
- ActiveJobを使っている場合はジョブのログも
- スロークエリログの発生箇所が少し特定しやすくなる
How to
Railsアプリケーションの設定に以下を追加するだけ
config.active_record.query_log_tags_enabled = true
# カスタマイズする場合は `query_log_tags=` を使って指定可能
config.active_record.query_log_tags = [ :controller, :action ]
前提知識
Verbose Query Logsについて
Railsアプリケーションを開発していてふとログを見た時に、SQLログのすぐ下にソースコードのどの行で呼ばれたのかが出力されている (下記参照) のが地味に便利だったりする。
Article Load (0.2ms) SELECT "articles".* FROM "articles"
↳ app/models/article.rb:5 # <- これ
これはActiveRecordの Verbose Query Logs という機能で、 config.active_record.verbose_query_logs = true
のようにして設定を有効化できる。Rails 5.2以降にrails newされたアプリケーションであれば意図的に無効化していない限り config/environments/development.rb にこの記述があると思う。
ActiveRecord::QueryLogs
一方で、RAILS_ENV=productionな環境では通常 config.active_record.verbose_query_logs
がtrueではないのでrails serverのログが手元で開発している時よりも追いづらかったりする。たとえば開発用にデプロイしたRailsアプリケーションの動作検証をしていて、何か期待通りに動かないなってときにデバッグが捗らない…なんてことがある。
このようなことを改善する手段のひとつとして、Rails 7.0で追加された ActiveRecord::QueryLogs が使える。ActiveRecord::QueryLogsを使うと、以下のようにSQLログのコメントにコントローラ名・アクション名やActiveJobを使っている場合はジョブ名などを含めることができる(どのような情報を含めるかはカスタマイズ可能)。
SELECT * FROM books /*application:MyApp;controller:books;action:index*/