1. 概要
バージョン「8.4」あたりから、「PostgreSQL」のログは、だいぶ使いやすくなっています。
以下、「FreeBSD 13.5 RELEASE」「postgresql16」を例題に、ログの設定について記述します。
本ページは、下記のサイトを参考にさせていただきました。
「PostgreSQL で実行された SQL をログ出力する方法 #PostgreSQL」
2. postgresql.conf の設定
「FreeBSD」の場合。
/var/db/postgres/data16/postgresql.conf
で出力先や動作を指定することができます。
「data16」の部分は、バージョンによって異なります。
コンフィグレーションファイルの編集の際は気を付けて、所有者が「postgres:postgres」から変わらないようにします。
「root」ユーザで編集して所有者が、「root:wheel」になったりすると、「PortgreSQL」起動時に読み込めなくて、えらいことになります。
sudo su postgres -c "vim -c ':set number' -c ':set mouse-=a' /var/db/postgres/data16/postgresql.conf"
で編集しましょう。
「postgreSQL」のコンフィグレーションファイルはすべてこのやり方で編集します。
ログの指定方法は、バージョンによって違いがあるようなので、詳細は「Let's Postgres ログ関連の設定」を参考にしてください。
/var/log/postgresql/postgresql.log
というファイルに出力させ、1日ずつローテーションさせることとしますと。
log_destination = 'syslog'
#log_destination = 'stderr' # Valid values are combinations of
を。
#log_destination = 'syslog'
log_destination = 'stderr' # Valid values are combinations of
に変えます。以下、矢印で・・・。
#logging_collector = off # Enable capturing of stderr and csvlog
↓
logging_collector = on # Enable capturing of stderr and csvlog
#log_directory = 'log' # directory where log files are written,
↓
log_directory = '/var/log/postgresql' # directory where log files are written,
次は、ファイル名ですが、ファイル名については、次項でもう少し詳しく。
#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
↓
log_filename = 'postgresql.log'
これは、ローテーションの具合をみて書き換えるかも・・・。
#log_rotation_age = 1d # Automatic rotation of logfiles will
↓
log_rotation_age = 1d # Automatic rotation of logfiles will
1日ごとにローテーションさせます。
ローテーションは、「newsyslog.conf」に書いてそちらで制御させようかとも思ったのですが、ファイルの所有権の問題がややこしそうなので、当面こちらで・・・。
#log_line_prefix = '%m [%p] ' # special values:
↓
log_line_prefix = '%t ' # special values:
とりあえず、先頭に出力時刻だけつけるようにします。
後ろにセパレータの空白か何かをいれないと後続のメッセージとくっついて出力されちゃいます。
3. ファイル名書式
バージョン・プラットフォームによって、ファイル名のデフォルト書式は、異なるようです。
「FreeBSD」「PostgreSQL 16.8」、「AlmaLinux 8.8」「PostgreSQL 9.6.24」では。
#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
「AlmaLinux 9.5」「PostgreSQL 17.4」では。
log_filename = 'postgresql-%a.log' # log file name pattern,
となっております。
これは、わかりにくい。
「-」の後ろが、「Mon」~「Sun」なんだもの、「tail」コマンド等で指定しにくいですな。
わたしは、ローテーションは、別途考えるとして、下記の書式を使っています。
log_filename = 'postgresql.log'
4. SQL 出力
通常、「SQL」をいちいち出力していると、大変なことになるので、出力はしませんが・・・。
開発時等、「SQL」を確認したいときがあります。
そのときの設定を。
「log_statement」がキーワードになります。
「FreeBSD 13.5 RELEASE」「PostgreSQL 16」の場合(行番号は、怪しいですが)。
#log_statement = 'none' # none, ddl, mod, all
先頭の「#」を外して有効化します。
参考サイトによれば、下記の意味があるらしい。
5. フォルダとファイルの作成
初回出力用にフォルダとファイルを作成します。
「root」ユーザ権限で。
mkdir -pv /var/log/postgresql
touch /var/log/postgresql/postgresql.log
chown -R postgres:postgres /var/log/postgresql
6. 出力の確認
「PortgreSQL」を再起動して、ログを確認します。
「root」ユーザ権限で。
service postgresql restart
ログの中身を確認してみます。
tail -f /var/log/postgresql/postgresql.log
下記のようになっています。
2025-03-21 09:06:45 JST LOG: starting PostgreSQL 16.8 on amd64-portbld-freebsd13.5, compiled by clang version 19.1.7, 64-bit
2025-03-21 09:06:45 JST LOG: listening on IPv6 address "::1", port 5432
2025-03-21 09:06:45 JST LOG: listening on IPv4 address "127.0.0.1", port 5432
2025-03-21 09:06:45 JST LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
2025-03-21 09:06:45 JST LOG: database system was shut down at 2025-03-21 09:06:44 JST
2025-03-21 09:06:45 JST LOG: database system is ready to accept connections
ログの出力は、意図通りになりました。