ポストグレスコンテナのログを監視するには?

ショコラ
ショコラ

ポストグレスコンテナのログを監視するには?

コンテナの標準出力の内容をホストの SYSLOG に送ってキメマス。

(注意)logging_collector=on だと標準出力に出力されなくなるので、もしログが出なければそちらの設定を確認してください。

↓↓↓こちらが仕様
①ポストグレスのログは接続ログ、エラーログのみ監視対象にする。
②ポストグレスのログファイルには出力しない。
③ポスグレスのログはホストの SYSLOG に送り、/var/log/postgres.log に出力する。
④エラーの場合は onmail で送信する。

もっさん先輩
もっさん先輩
  1. ホストの rsyslog の設定ファイルをバックアップします。
cp /etc/rsyslog.conf /etc/rsyslog.conf.bak
  1. ホストの rsyslog の設定ファイル(rsyslog.conf)を修正します。

CentOS7.9(旧書式)

sed -i\
 -e 's/#$ModLoad imtcp/$ModLoad imtcp/'\
 -e 's/#$InputTCPServerRun 514/$InputTCPServerRun 514/'\
 -e 's/*.info;mail.none;authpriv.none;cron.none/*.info;mail.none;authpriv.none;cron.none;local0.none/'\
 /etc/rsyslog.conf

Ubuntu20.04.1 LTS(新書式)

変更前

#module(load="imtcp")
#input(type="imtcp" port="514")

変更後

module(load="imtcp")
input(type="imtcp" port="514")
  1. postgres.conf を作成します。
echo 'local0.* /var/log/postgres.log' > /etc/rsyslog.d/postgres.conf
  1. ommail.conf を作成します。

CentOS7.9(旧書式)

cat <<'EOF' > /etc/rsyslog.d/ommail.conf
$ModLoad ommail
$template mailSubject,"Syslog Warning"
$template mailBody,"From:%fromhost%\r\n%msg%"
$ActionMailSMTPServer localhost
$ActionMailSMTPPort 25
$ActionMailFrom syslog@answorz.com
$ActionMailTo alert@answorz.com
$ActionMailSubject mailSubject
$ActionExecOnlyOnceEveryInterval 1
if ($syslogtag contains 'postgres')\
 and (($msg contains 'FATAL') or ($msg contains 'ERROR'))\
 then :ommail:;mailBody
EOF

Ubuntu20.04.1 LTS(新書式)

cat <<'EOF' > /etc/rsyslog.d/ommail.conf
module(load="ommail")
template (name="mailSubject" type="string" string="Syslog Warning")
template (name="mailBody" type="string" string="From:%fromhost%\r\n%msg%")
if (($syslogtag contains "postgres")\
  and (($msg contains "FATAL") or (($msg contains "ERROR")))) then {
  action(type="ommail" server="localhost" port="25"
    mailfrom="syslog@answorz.com"
    mailto=["alert@answorz.com"]
    subject.template="mailSubject"
    action.execonlyonceeveryinterval="1")
}
EOF
  1. rsyslog.conf のチェックします。
rsyslogd -N 1
  1. ホストの rsyslog を再起動します。
systemctl restart rsyslog 
  1. loggerコマンドでメールが送られるかテストします。
logger -i -p local0.debug -t postgres '[FATAL]ommail test'
  1. ポストグレスコンテナを起動します。
docker run\
 --name postgres\
 --log-driver=syslog\
 --log-opt syslog-facility=local0\
 --log-opt tag=postgres\
 --log-opt syslog-address=tcp://localhost:514\
 -e POSTGRES_PASSWORD=password\
 postgres:9\
 postgres\
 -c log_connections=on\
 -c log_line_prefix='[%t] %u %d %p[%l]'

ドッカーコンポーズなら↓こちらです。

services:
  postgres:
    image: postgres:9
    environment:
      POSTGRES_PASSWORD=password
    logging:
      driver: syslog
      options:
        syslog-facility: local0
        tag: postgres
        syslog-address: tcp://localhost:514
    command:
      - "postgres"
      - "-c"
      - "log_connections=on"
      - "-c"
      - "log_line_prefix='[%t]%u %d %p[%l]"

もしかして・・・起動オプションが効かない場合は設定ファイルに設定します。

log_destination = 'stderr'
log_line_prefix='[%t]%u %d %p[%l]'
log_connections = on

「syslog-address=tcp://localhost:514」を定義するとコンテナ起動時に SYSLOG が立ち上がっているかチェックが入ります。SYSLOG が立ち上がっていない場合エラーになりコンテナは起動しません。

Error response from daemon: failed to initialize logging driver: dial tcp 127.0.0.1:514: connect: connection refused
  1. ポストグレスコンテナでエラーを発生させます。
docker exec --user postgres postgres psql error

これで警告メールが送られてきます。
(ホストの SMTP が設定してあれば・・・)

以上

Scroll to Top