Монго документы сказать, что я могу:
Я хочу, чтобы функция logrotate заархивировала старые файлы и удалила самые старые, но не вижу способа указать процессу mongod переключить текущий журнал, кроме отправки SIGUSR1.
Я написал
/var/log/mongodb/*.log {
daily
rotate 5
compress
dateext
missingok
notifempty
sharedscripts
postrotate
/usr/bin/killall -SIGUSR1 mongod
/usr/bin/killall -SIGUSR1 mongos
endscript
}
в /etc/logrotate.d/mongo.
А теперь получите хорошо названные файлы журнала из logrotate и пустые файлы журнала, например mongodb.log.2013-09-18T23-49-44
как следы переключения SIGUSR1. Как избавиться от последнего?
Начиная с mongodb 3.0 вы можете изменить поведение mongodb с помощью параметра logRotate, изменив в /etc/mongod.conf
systemLog:
logAppend: true
logRotate: reopen
Смотрите также Инструкции Mongo.
Затем вы можете использовать эту конфигурацию logrotate:
/var/log/mongodb/*.log {
daily
rotate 30
size 50M
compress
dateext
missingok
notifempty
sharedscripts
postrotate
/bin/kill -SIGUSR1 `cat /var/lib/mongodb/mongod.lock 2> /dev/null` 2> /dev/null || true
endscript
}
Для меня сервер упал, если вы отправите SIGUSR1 на mongod после того, как вы переместили файл журнала с пути с помощью logrotate.
Следующая конфигурация безопасна для версии, которую я тестировал - 2.6.6 в ubuntu 12.04 - в предыдущих примерах произошел сбой сервера. Поместите это в /etc/logrotate.d/mongod:
/var/log/mongodb/mongodb.log {
weekly
missingok
rotate 4
compress
notifempty
create
postrotate
/usr/bin/pkill -USR1 mongod
rm /var/log/mongodb/mongodb.log.????-??-??T??-??-??
endscript
}
Видеть: https://jira.mongodb.org/browse/SERVER-11087 для получения дополнительных сведений и предложения Акшая Кумара, которое я использовал выше (используйте create вместо nocreate и cp / dev / null в файл журнала).
В более поздних выпусках должна быть опция logRotate, которую вы можете использовать для повторного открытия файла, а не для его переименования, которая поможет обойти проблему переименования, но в моей версии она не сработала (она не поддерживалась).
Видеть: https://github.com/mongodb/mongo/commit/616461d294bd9f5054ca38b302b6fc5d70fde20c
Я тестировал это с
logrotate -v -f /etc/logrotate.d/mongod
copytruncate очень хорошо работает для логротации.
конфигурация, подобная этой, должна сделать эту работу за вас:
/var/log/mongodb/*.log {
daily
missingok
rotate 5
compress
dateext
delaycompress
copytruncate
notifempty
}
У меня сработало следующее:
/var/log/mongo/mongod.log {
missingok
rotate 3
size 100M
nodateext
postrotate
/usr/bin/kill -USR1 $(cat /var/run/mongod.pid)
rm -f /var/log/mongo/mongod.log.[0-9][0-9][0-9][0-9]-*
endscript
}
Ноты:
kill
является встроенным Bash, но logrotate работает под /bin/sh
- который не распознает SIGUSR1
в RedHat 6.5compress
но это должно быть простое дополнениеОбратите внимание, что в версии 3.0 и выше не требуется убивать демон базы данных просто для ротации журнала. См. Документацию здесь: