データベース - postgreSQL - ログ


 クラウディア


1. 概要
2. postgresql.conf の設定
3. ファイル名書式
4. SQL 出力
5. フォルダとファイルの作成
6. 出力の確認

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
 先頭の「#」を外して有効化します。  参考サイトによれば、下記の意味があるらしい。
意    味  備考 
none 出力しない
ddl CREATE、ALTER、および DROP 文といった、データ定義文を出力
mod ddl に加えて INSERT、UPDATE、DELETE、TRUNCATE といったデータ変更文を出力
all すべての SQL を出力

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
 ログの出力は、意図通りになりました。

ハイスピードプランU-NEXT