はじめに
こんにちは。GMOアドマーケティングの石丸(@thomi40)です。
以前、本ブログでRails 6.1に新しく追加された機能について紹介しました。
今回はRails 7から追加された「query_log_tags」について紹介します。
query_log_tagsとは?
query_log_tags
は Active Record のオプションの一つで、設定を有効にすることでクエリのログに自動でコメントを追加することができる機能です。元々は「Marginalia」というGemで実装されていた機能とのこと。
詳細リンク
Add Marginalia to Rails, via QueryLogs by keeran · Pull Request #42240 · rails/rails
https://github.com/rails/rails/pull/42240
早速実際の動きを見てみましょう。
検証用の環境構築
query_log_tagsはRails 7から追加された機能なので、Rails 7の環境を構築していきます。今回もDocker環境で、Rubyは3.1.2, Railsは7.0.3を指定しました。
詳細は割愛しますが、今回用意したGemfileやDockerファイルは以下の通りです。
1 2 |
source 'https://rubygems.org' gem 'rails', '7.0.3' |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
FROM ruby:3.1.2 RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp # Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process. CMD ["rails", "server", "-b", "0.0.0.0"] |
rails new
や scaffold
などを実行します。
1 2 3 4 5 6 |
$ docker-compose run web rails new . --force --no-deps --database=mysql $ docker-compose build $ docker-compose run --rm web bin/rails db:migrate $ docker-compose up $ docker-compose run web rails g scaffold user name:string email:string password_digest:string $ docker-compose run web rails g scaffold task name:string user:references |
query_log_tagsの実装
機能を有効化するために、config/application.rb
に一行追加します。
1 2 3 4 5 |
module Myapp class Application < Rails::Application config.active_record.query_log_tags_enabled = true # 追加 end end |
query_log_tags_enabled
を true
に設定することで、SQLのクエリログに自動でコメントが追加されます。設定を有効にした状態で
GET "/tasks"
にアクセスしてみます。controllerは以下の通り。
1 2 3 4 5 6 7 |
class TasksController < ApplicationController def index @tasks = Task.all end end |
デフォルトでは
application
, controller
, action
が表示されるようです。実行元のcontrollerやactionがコメントとして追加されるのは便利ですね。
1 |
Task Load (7.4ms) SELECT `tasks`.* FROM `tasks` /*application:Myapp,controller:tasks,action:index*/ |
query_log_tags
を指定することで、出力されるコメントを定義することも可能です。まずは
ActiveRecord::QueryLogs
側で用意されているタグを追加してみます。
1 2 3 4 5 6 |
config.active_record.query_log_tags = [ :application, :db_host, :database, :pid ] |
データベースのホスト名やデータベース名がコメントとして表示されました。
1 |
Task Load (0.7ms) SELECT `tasks`.* FROM `tasks` /*application:Myapp,db_host:db,database:myapp_development,pid:1,controller:tasks,action:index*/ |
1 2 3 4 5 6 7 |
config.active_record.query_log_tags = [ :application, { app_ver: 'v1', current_time: -> { Time.now } } ] |
1 |
Task Load (0.5ms) SELECT `tasks`.* FROM `tasks` /*application:Myapp,app_ver:v1,current_time:2022-05-30 10:09:49 +0000,controller:tasks,action:index*/ |
app_ver
として固定の文字列, current_time
として現在の時間を表示することができました。
まとめ
今回はクエリのログにコメントを追加する機能query_log_tags
について紹介しました。今回の機能を活用することで、スロークエリの調査が効率的になったり、
current_user.xxx
などの定義を追加することでクエリを実行したユーザーをコメントとしてログに出力することも可能です。オプションの詳細や実装の背景に関しては以下の参考リンクからご確認ください。
参考リンク
- rails/query_logs.rb at 7-0-stable · rails/rails
https://github.com/rails/rails/blob/7-0-stable/activerecord/lib/active_record/query_logs.rb , (参照: 2022/05/30)
- ActiveRecord::QueryLogs
https://api.rubyonrails.org/classes/ActiveRecord/QueryLogs.html , (参照: 2022/05/30)

2016卒のWebエンジニア。
採用やマネジメントもやってます。