MongoDBのログローテーションをしたくて調べて設定してみました。(バージョンは3.4)
やりたいこと
ログは1日1回ローテーションしたい。
ローテーション後のログファイルは mongod.log_yyyymmdd という名前をつけたい。
自動圧縮したい。
溜め続けるのではなく一定期間が経過したら自動削除したい。
やったこと
logrotateで以下のように設定
# vi /etc/logrotate.d/mongod
/usr/local/var/log/mongodb/mongod.log
{
missingok
daily
dateext
rotate 30
create
compress
delaycompress
postrotate
/bin/kill -SIGUSR1 `cat /var/run/mongodb/mongod.pid 2> /dev/null` 2> /dev/null || true
find /data/mongodb/logs -type f -size 0 -regextype posix-awk -regex "^\/usr\/local\/var\/log\/mongodb\/mongod\.log\.[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}-[0-9]{2}-[0-9]{2}$" -execdir rm {} \; >/dev/null 2>&1
endscript
}
メモ
kill -SIGUSR1 でMongoDBのログローテートを行うと、MongoDBが mongod.log.yyyy-mm-ddTxx-xx-xx という名前の空ログファイルを作ってしまうので find を使用して消している。
create ではなくnocreate にすると、MongoDBがログファイルを見失って
ローテーションのタイミングでMongoDBが異常終了する。