DockerでPostgreSQL公式イメージを起動する際にスロークエリ出力を有効にする
はじめに
特にDocker ComposeでPostgreSQL公式イメージを利用しようと思った場合に、postgresql.conf
を編集せずにスロークエリログの出力を有効にする方法について紹介します。
検証環境
普通にPostgreSQLを起動した場合
起動
まずは普通にPostgreSQLを起動してみます。
PostgreSQLを起動する場合、通常は docker run -d
というように -d
オプションを付与してデーモン起動させます。
ただし、今回はログを意図的に表示させたいこともあり -d
オプションを付けずに起動します。
PostgreSQLイメージでは以下の環境変数3つは起動に必須です。
POSTGRES_PASSWORD
POSTGRES_USER
POSTGRES_DB
アクセスして設定を確認
起動したコンテナ上のPostgreSQLデータベースに psql
コマンドを使ってログインしてみます。docker run
したターミナルとは別に、ターミナルを立ち上げます。(WindowsならコマンドプロンプトあるいはPowerShellになるのかな?)
psql
上で show all;
コマンドを実行するとデータベースの設定情報が出力されます。
log_min_duration_statement という設定パラメータの値が、スロークエリログ出力対象の設定値となります。
SQLの実行に log_min_duration_statement の設定値以上の時間がかかった場合、ログ出力されます。
ただし -1
の場合にはスロークエリログは出力されません。
処理に3秒以上かかった場合にログ出力させるようにする
log_min_duration_statement の設定値を変更するには postgresql.conf
に設定を追記するという方法がありますが、これだとPostgreSQL公式イメージを利用した新たなDockerイメージを作らなければなりません。
Dockerfileを作成することなくログ出力させるには、 docker run
実行時のコマンドに引数を追加してやります。
起動
アクセスして設定を確認
docker run
したターミナルとは別に、ターミナルを立ち上げ、 psql
で接続して設定を確認してみます。
先程は -1 だった設定値が 2s となっていることがわかります。
SQL実行に2秒以上かかった場合にログに出力される設定になったはずです。
動作確認
正しく動作するか動作を確認してみます。
pg_sleep()
というPostgreSQLの関数を利用することで意図的に実行時間を操作できます。
引数はsleepする時間を秒単位で指定します。
まずは1秒スリープさせてみます。
docker run
コマンドを実行しているターミナルには変化はないはずです。
次に2秒スリープさせてみます。
docker run
させているターミナルに以下の1行が追記されているはずです。
処理に時間がかかったSQL文がログに出力されていることがわかります。
Docker Composeで利用する場合
最後に Docker Comopose で利用する場合を想定した docker-compose.yml
の記述方法を掲載しておきます。
ひとこと
Webページの速度改善などに参考にしていただければ幸いです。
ディスカッション
コメント一覧
まだ、コメントがありません