libpqのロギング機能の改善 – PostgreSQL 14でコミットされた機能の先行紹介:技術者Blog
PostgreSQLインサイド

岩田 彩

富士通株式会社
ソフトウェア事業本部 データマネジメント事業部

2016年からPostgreSQLをベースとした「FUJITSU Software Enterprise Postgres」の開発業務に従事するとともに、PostgreSQLコミュニティー、Npgsqlコミュニティーでの活動にも参加。

はじめに

この記事では、PostgreSQL 14に提供される予定であるlibpqのロギング機能改善について紹介します。libpqアプリケーションのサーバー / クライアント通信内容をトレースする機能において、出力内容を制御する方法の提供とフォーマットの改善を行い、利便性を向上させました。

背景

岩田
クライアントライブラリーの1つであるlibpqでは、PQtrace関数を使うことで、クライアントとサーバーの通信内容をログに出力できます。通信内容とは、PostgreSQLが通信で用いるプロトコルメッセージのことです。プロトコルメッセージには、メッセージの種別を表すメッセージの識別子、メッセージの長さ、交換する情報のメッセージコンテンツが含まれています。アプリケーション開発者は、このログを使って意図した通信が行われているか?問題はないか?を確認できます。

PostgreSQL 13までは、PQtrace関数を呼び出すと、指定した出力ファイルには以下のようなログが書き出されました。

従来のPQtrace関数で取得できるログの出力結果には、タイムスタンプが含まれないため、処理に時間がかかった箇所の調査に使うことができませんでした。
また、メッセージの識別子やサーバー / クライアントにおけるメッセージの長さ、コンテンツが1行につき1つ出力されるためにプロトコルメッセージを解析するのがとても困難だったり、可読性が低いといった問題がありました。上記ログにおいて①の行に登場している"Z"や"C"などの英文字は、プロトコルメッセージの識別子です。それぞれの単語の意味を理解するためには、PostgreSQL 13.3 Documentaitonの「52.7 Message Formats」を参照する必要がありました。

機能改善の概要

岩田
PostgreSQL 14では、PQtrace関数が改善され、ログの読みやすさが向上し、タイムスタンプが出力できるようになりました。さらに、タイムスタンプの出力を制御するために、PQsetTraceFlags関数が新たに追加されました。

改善されたログの出力結果について

PostgreSQL 14で改善されたログは、以下のような出力結果になります。

これは、PostgreSQL 13までのログ出力例と全く同じ処理のログを取得したものです。改善点は、以下の4つです。

  • ① タイムスタンプが取得できるようになりました。
  • ② フロントエンドから送出されるメッセージ(F)か、バックエンドから送出されるメッセージ(B)か、を出力します。
  • ③ プロトコルメッセージの識別子の代わりに正式なメッセージ名を出力します。
  • ④ 意味のあるプロトコルメッセージを1行にまとめて出力します。

ログ取得方法について

libpqアプリケーションの中でPQtrace関数を呼び出すことで、ログ取得を開始します。これは従来の使い方と変わりません。もし、タイムスタンプの出力が必要ない場合は、今回の改善で新たに追加されたPQsetTraceFlags関数で制御できます。

効果

岩田
PQtrace関数の機能改善によりタイムスタンプが取得できるようになったことで、時間がかかった処理を特定できるようになりました。例えば、アプリケーションの動作が急に遅くなった時に、ログのタイムスタンプにおける差分を確認することで、時間がかかっているのがサーバーか?クライアントか?の切り分けができます。
また、意味のあるプロトコルメッセージが1行で出力されるため、libpqのログに慣れていない人でも、ログを見ただけでどのような通信がサーバーとクライアント間で行われているのか容易に理解できます。
タイムスタンプを出力させるかどうかは、PQsetTraceFlags関数を使って制御できるため、このログをリグレッションテストなどで使うこともできます。タイムスタンプを出力しないようにすることで、期待するテストの実行結果についてのログをあらかじめ用意し、テストの実行で取得したログと比較できます。

今後に向けて

岩田
今回の改善でlibpqのログでタイムスタンプが出力されるようになり、また、ログも読みやすさも格段に向上しました。
現在の機能では、PQtrace関数で指定したファイルにログが書き込まれます。そのため、場合によってはログサイズがとても大きくなり、ファイル操作に時間がかかります。この問題を改善するために、ファイルサイズの上限を設定できるようにしたいです。
また、アプリケーションを変更しなくても、ログの出力先ディレクトリーやログファイル名を環境に合わせて変更できるように、それらを環境変数と接続パラメーターで設定できるようにしたいです。次版では、今以上に使いやすい機能になるように改善を検討していきます。

2021年7月9日公開

オンデマンド(動画)セミナー

    • PostgreSQLに関連するセミナー動画を公開中。いつでもセミナーをご覧いただけます。
      • 【事例解説】運送業務改革をもたらす次世代の運送業界向けDXプラットフォームの構築
      • ハイブリッドクラウドに最適なOSSベースのデータベースご紹介

本コンテンツに関するお問い合わせ

お電話でのお問い合わせ

Webでのお問い合わせ

当社はセキュリティ保護の観点からSSL技術を使用しております。

ページの先頭へ