ショコラ
ポストグレスコンテナのログを監視するには?
コンテナの標準出力の内容をホストの SYSLOG に送ってキメマス。
(注意)logging_collector=on だと標準出力に出力されなくなるので、もしログが出なければそちらの設定を確認してください。
↓↓↓こちらが仕様
①ポストグレスのログは接続ログ、エラーログのみ監視対象にする。
②ポストグレスのログファイルには出力しない。
③ポスグレスのログはホストの SYSLOG に送り、/var/log/postgres.log に出力する。
④エラーの場合は onmail で送信する。
もっさん先輩
- ホストの rsyslog の設定ファイルをバックアップします。
cp /etc/rsyslog.conf /etc/rsyslog.conf.bak
- ホストの 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")
- postgres.conf を作成します。
echo 'local0.* /var/log/postgres.log' > /etc/rsyslog.d/postgres.conf
- 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
- rsyslog.conf のチェックします。
rsyslogd -N 1
- ホストの rsyslog を再起動します。
systemctl restart rsyslog
- loggerコマンドでメールが送られるかテストします。
logger -i -p local0.debug -t postgres '[FATAL]ommail test'
- ポストグレスコンテナを起動します。
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
- ポストグレスコンテナでエラーを発生させます。
docker exec --user postgres postgres psql error
これで警告メールが送られてきます。
(ホストの SMTP が設定してあれば・・・)
以上