はじめに

テスト目的でAzure Database for PostgreSQLのログの出力量を増やす必要があり、
いろいろ試した結果やり方がわかったので備忘録として残します。

方法

デバッグ用のログを出力する設定を有効化する。

以下の3つのサーバーパラメーターを有効化します。

  • debug_print_plan
    クエリの実行計画をログ出力にします。
  • debug_print_parse
    クエリのparseツリーをログ出力します。
  • debug_print_rewritten
    クエリのrewrittenツリーをログ出力します。

これらの設定を有効化することでログの出力量が増えます。

パラメーターの詳細については下記のドキュメントをご参照ください。
問い合わせツリーとは
Error Reporting and Logging

以上になります。
以降はAzure CLIやTerraformで設定する方法について記載していきます。

Azure CLI

  • Azure CLIで既存のPostgreSQLの設定を変更する場合は、このようにコマンドを実行します。
az postgres server configuration set --name debug_print_plan --resource-group リソースグループ名 --server PostgreSQLサーバー名 --value on
az postgres server configuration set --name debug_print_parse --resource-group リソースグループ名 --server PostgreSQLサーバー名 --value on
az postgres server configuration set --name debug_print_rewritten --resource-group リソースグループ名 --server PostgreSQLサーバー名 --value on

詳細については下記のドキュメントをご参照ください。
Azure CLI を使用して Azure Database for PostgreSQL – Single Server のサーバー構成パラメーターをカスタマイズする

Terraform

  • Terraformでこれらを有効化した環境を構築する場合は、このように記述します。
resource "azurerm_postgresql_configuration" "debug_print_plan" {
  name                = "debug_print_plan"
  resource_group_name = azurerm_resource_group.test.name
  server_name         = azurerm_postgresql_server.test.name
  value               = "on"
}

resource "azurerm_postgresql_configuration" "debug_print_parse" {
  name                = "debug_print_parse"
  resource_group_name = azurerm_resource_group.test.name
  server_name         = azurerm_postgresql_server.test.name
  value               = "on"
}

resource "azurerm_postgresql_configuration" "debug_print_rewritten" {
  name                = "debug_print_rewritten"
  resource_group_name = azurerm_resource_group.test.name
  server_name         = azurerm_postgresql_server.test.name
  value               = "on"
}

実際にリソースを立ち上げてみたい場合は、
github上に全体のソースコードを載せているのでぜひ参考にしてください。
https://github.com/tkhs1121/terraform-azure-sample/tree/master/postgresql-log

番外編

  • それなりのログを出力してくれるクエリのサンプル。
DROP TABLE IF EXISTS t1;

CREATE TABLE t1 (
    id SERIAL PRIMARY KEY,
    data TEXT
);

DO $$
DECLARE
  i INTEGER := 1;
BEGIN
  WHILE i <= 1000000 LOOP
    INSERT INTO t1 (data)
    VALUES (LPAD('', 8000, 'a'));
    i := i + 1;
  END LOOP;
END $$;

テストの内容的にある程度のログ出力が必要でかなり多めにInsertしているので、
実際に実行する際は調整してください。

さいごに

誰かのお役に立てれば幸いです。