2024年7月15日月曜日

PostgreSQLのログ出力先と保管期間を設定する

PostgreSQLのデフォルト設定では、ログファイル/var/lib/pgsql/data/log/に、曜日単位で出力される。

# ls -l /var/lib/pgsql/data/log/
-rw-------. 1 postgres postgres    0  7月  5 00:00 postgresql-Fri.log
-rw-------. 1 postgres postgres    0  7月  8 00:00 postgresql-Mon.log
-rw-------. 1 postgres postgres    0  7月  6 00:00 postgresql-Sat.log
-rw-------. 1 postgres postgres    0  7月  7 00:00 postgresql-Sun.log
-rw-------. 1 postgres postgres    0  7月  4 00:00 postgresql-Thu.log
-rw-------. 1 postgres postgres    0  7月  9 00:00 postgresql-Tue.log
-rw-------. 1 postgres postgres 4943  7月 10 15:52 postgresql-Wed.log

デフォルト設定では、ログが1週間分しか保管されずログが上書きされてしまうことや、そもそもLinuxの標準のログ出力先である/var/log/ディレクトリに出力されていないことなど、管理面で問題がある。

そこで本記事では、PostgreSQLのログ出力設定を変更し、ログの出力先と保管期間の設定変更を行う。出力手順は大きく2つの方法があるため、両方の設定手順を記載する。

  • syslog経由で出力する方法
  • stderr経由で出力する方法 (デフォルト)

環境

  • OS : AlmaLinux 9.4
  • PostgreSQL : 13.14

ログ出力設定手順① (syslog)

1. ログ出力先のディレクトリを作成

ログ出力先のディレクトリを作成する。今回は、/var/log/postgresql/とした。

# mkdir /var/log/postgresql
# chown postgres:postgres /var/log/postgresql

# ls -ld /var/log/postgresql/
drwxr-xr-x. 2 postgres postgres 6  7月 14 17:24 /var/log/postgresql/

2. postgresql.confを修正

ログ出力先や出力時のファイル名を変更するため、postgresql.confを修正する。syslogのファシリティは任意でよいが、本記事ではlocal3を指定した。

# vi /var/lib/pgsql/data/postgresql.conf
------------------------------
# ログの出力先をsyslogに変更
#log_destination = 'stderr'
↓
log_destination = 'syslog'

# ログファイルのフォーマットをpostgresql.logに変更
log_filename = 'postgresql-%a.log'
   ↓
log_filename = 'postgresql.log'

# syslogの各種設定を追加
#syslog_facility = 'LOCAL0'
#syslog_ident = 'postgres'
#syslog_sequence_numbers = on
#syslog_split_messages = on
   ↓
syslog_facility = 'LOCAL3'
syslog_ident = 'postgres'
syslog_sequence_numbers = on
syslog_split_messages = on

3. rsyslog設定

PostgreSQLが出力したsyslogをログファイルに出力するよう、rsyslogの設定を行う。

rsyslog.confに以下行を追記する。先ほどのPostgreSQLの設定と合わせて、ファシリティはlocal3を指定する。

# vi /etc/rsyslog.conf
------------------------------
# Log PostgreSQL
local3.*                                                /var/log/postgres/postgres.log

4. 反映

設定を反映させるため、rsyslogとPostgreSQLを再起動する。

systemctl restart rsyslog
systemctl restart postgresql

PostgreSQLの再起動時にログが出力されていることを確認しておこう。

# cat /var/log/postgres/postgres.log
Jul 15 06:49:20 t1023zabi postgres[1540934]: [1-1] 2024-07-15 06:49:20.312 JST [1540934] LOG:  ログ出力をログ収集プロセスにリダイレクトしています
Jul 15 06:49:20 t1023zabi postgres[1540934]: [1-2] 2024-07-15 06:49:20.312 JST [1540934] ヒント:  ここからのログ出力はディレクトリ"/var/log/postgresql"に現れます。
Jul 15 06:49:20 t1023zabi postgres[1540934]: [2-1] 2024-07-15 06:49:20.312 JST [1540934] LOG:  標準エラー出力へのログ出力を終了しています
Jul 15 06:49:20 t1023zabi postgres[1540934]: [2-2] 2024-07-15 06:49:20.312 JST [1540934] ヒント:  この後のログ出力はログ配送先"syslog"に出力されます。
Jul 15 06:49:20 t1023zabi postgres[1540934]: [3-1] 2024-07-15 06:49:20.312 JST [1540934] LOG:  PostgreSQL 13.14 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 11.4.1 20230605 (Red Hat 11.4.1-2), 64-bit を起動しています
Jul 15 06:49:20 t1023zabi postgres[1540934]: [4-1] 2024-07-15 06:49:20.312 JST [1540934] LOG:  IPv6アドレス"::1"、ポート5432で待ち受けています
Jul 15 06:49:20 t1023zabi postgres[1540934]: [5-1] 2024-07-15 06:49:20.312 JST [1540934] LOG:  IPv4アドレス"127.0.0.1"、ポート5432で待ち受けています
Jul 15 06:49:20 t1023zabi postgres[1540934]: [6-1] 2024-07-15 06:49:20.313 JST [1540934] LOG:  Unixソケット"/var/run/postgresql/.s.PGSQL.5432"で待ち受けています
Jul 15 06:49:20 t1023zabi postgres[1540934]: [7-1] 2024-07-15 06:49:20.313 JST [1540934] LOG:  Unixソケット"/tmp/.s.PGSQL.5432"で待ち受けています
Jul 15 06:49:20 t1023zabi postgres[1540936]: [8-1] 2024-07-15 06:49:20.315 JST [1540936] LOG:  データベースシステムは 2024-07-15 06:49:20 JST にシャットダウンしました
Jul 15 06:49:20 t1023zabi postgres[1540934]: [8-1] 2024-07-15 06:49:20.317 JST [1540934] LOG:  データベースシステムの接続受け付け準備が整いました

5. logrotate設定

出力されたログに対してlogrotateの機能を用いてログローテートするよう設定する。

今回は、毎日ログローテートを行い31日間保管する設定とした。容量削減のため、翌々日のログから圧縮する設定としている。また、ログファイルの切り替わり時にログを正常に出力できるよう、ログローテート時にrsyslogサービスのリロード(kill -HUP)を設定した。

# vi /etc/logrotate.d/postgresql
------------------------------
/var/log/postgresql/*.log {
  daily
  rotate 31
  dateext
  compress
  delaycompress
  create 644 postgres postgres
  missingok
  sharedscripts
  postrotate
    /usr/bin/systemctl -s HUP kill rsyslog.service >/dev/null 2>&1 || true
  endscript
}

以上で、syslogを用いたPostgreSQLのログ出力設定手順は完了となる。

ログ出力設定手順② (stderr出力パターン)

1. ログ出力先のディレクトリを作成

ログ出力先のディレクトリを作成する。今回は、/var/log/postgresql/とした。

# mkdir /var/log/postgresql
# chown postgres:postgres /var/log/postgresql

# ls -ld /var/log/postgresql/
drwxr-xr-x. 2 postgres postgres 6  7月 14 17:24 /var/log/postgresql/

2. postgresql.confを修正

ログ出力先や出力時のファイル名を変更するため、postgresql.confを修正する。

# vi /var/lib/pgsql/data/postgresql.conf
------------------------------
# ログディレクトリを/var/log/postgresql/に変更
#log_directory = 'log'
   ↓
log_directory = '/var/log/postgresql'

# ログファイルのフォーマットをpostgresql.logに変更
log_filename = 'postgresql-%a.log'
   ↓
log_filename = 'postgresql.log'

# PostgreSQLの機能のログローテーションを無効化
log_rotation_age = 1d
   ↓
log_rotation_age = 0

3. 設定反映

PostgreSQLを再起動して、設定反映を行う。

# systemctl restart postgresql

PostgreSQLの再起動時に起動ログが出力されるので、問題なく新しいディレクトリでファイルに出力されていることを確認しておこう。

# ls -l /var/log/postgresql/
-rw-------. 1 postgres postgres 893  7月 14 17:27 postgresql-20240714.log

# cat /var/log/postgresql/postgresql-20240714.log
2024-07-14 17:27:47.517 JST [1507397] LOG:  PostgreSQL 13.14 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 11.4.1 20230605 (Red Hat 11.4.1-2), 64-bit を起動しています
2024-07-14 17:27:47.517 JST [1507397] LOG:  IPv6アドレス"::1"、ポート5432で待ち受けています
2024-07-14 17:27:47.517 JST [1507397] LOG:  IPv4アドレス"127.0.0.1"、ポート5432で待ち受けています
2024-07-14 17:27:47.518 JST [1507397] LOG:  Unixソケット"/var/run/postgresql/.s.PGSQL.5432"で待ち受けています
2024-07-14 17:27:47.518 JST [1507397] LOG:  Unixソケット"/tmp/.s.PGSQL.5432"で待ち受けています
2024-07-14 17:27:47.519 JST [1507399] LOG:  データベースシステムは 2024-07-14 17:27:47 JST にシャットダウンしました
2024-07-14 17:27:47.522 JST [1507397] LOG:  データベースシステムの接続受け付け準備が整いました

4. logrotate設定

PostgreSQLはログローテート機能はあるが、保管期間を超えたログを削除する機能がないため、logrotateの機能を用いてログローテートを実装する。

今回は、毎日ログローテートを行い31日間保管する設定とした。容量削減のため、翌々日のログから圧縮する設定としている。また、ログファイルの切り替わり時にログを正常に出力できるよう、copytruncateオプションを設定している。

# vi /etc/logrotate.d/postgresql
------------------------------
/var/log/postgresql/*.log {
  daily
  rotate 31
  dateext
  compress
  delaycompress
  create 0640 postgres postgres
  missingok
  copytruncate
}

以上で、stderrを用いたPostgreSQLのログ出力設定手順は完了となる。

参考

0 件のコメント:

コメントを投稿