Назад | Перейти на главную страницу

Mongodb - правильный способ ротации журналов

Монго документы сказать, что я могу:

  1. используйте сигнал -SIGUSR1 и получите переименование старого журнала и переключение текущего
  2. использовать logrotate из ОС

Я хочу, чтобы функция 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
}

Ноты:

  • Проверено на RedHat 6.5
  • Единственный способ получить рабочее решение - это удалить пустые файлы журнала, создаваемые Mongo.
  • Расположение файла блокировки зависит от того, как был установлен MongoDB.
  • kill является встроенным Bash, но logrotate работает под /bin/sh - который не распознает SIGUSR1 в RedHat 6.5
  • Я не тестировал с compress но это должно быть простое дополнение

Обратите внимание, что в версии 3.0 и выше не требуется убивать демон базы данных просто для ротации журнала. См. Документацию здесь:

https://docs.mongodb.com/manual/tutorial/rotate-log-files/