Mongodb - правильный способ вращать логи

13

Документы Монго говорят, что я могу:

  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. Как избавиться от последнего?

Андрей Регентов
источник

Ответы:

11

copytruncate работает довольно хорошо для logrotation.

Конфигурация, подобная этой, должна сделать работу за вас:

/var/log/mongodb/*.log {
  daily
  missingok
  rotate 5
  compress
  dateext
  delaycompress
  copytruncate
  notifempty
}
steveberryman
источник
1
Это не сработало для меня на RedHat 6.5. Журналы были повернуты, но исходный файл .log продолжал расти без ограничений.
Томас Братт
@ThomasBratt это правильно, потому что без перезапуска процессов монго файл обработчик остается открытым. Этот метод не сработает.
Mxx
@ThomasBratt взгляните на этот ответ stackoverflow.com/a/8396266/949859
Mxx
1
@Mxx Хорошая находка - похоже, что copytruncate будет работать с шагом после поворота, чтобы подать Монго сигнал об усечении файла журнала
Томас Братт
15

Сервер рухнул для меня, если вы отправите 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
Билл Райдер
источник
Прекрасно работает для меня в Mongo 2.6.11 в CentOS 7
Тим
Мне пришлось заменить mongodb.log на mongod.log, и он работает
cwhisperer
Может подтвердить, что если systemLog.logRotate: reopenв mongod.conf, то pkill будет работать, как предполагалось, и не требуется удаление переименованного файла журнала, так как ни один не создан.
Джулиан Х. Лам
15

Начиная с mongodb 3.0, вы можете изменить поведение mongodb с помощью параметра logRotate, изменив его в /etc/mongod.conf

systemLog:
  logAppend: true
  logRotate: reopen

Смотрите также Mongo Manuals .

Затем вы можете использовать эту конфигурацию 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
}
mmx73
источник
Вероятно, следует использовать файл PID, созданный из файла конфигурации .... См. processManagement.pidFilePathВ конфигурации или настройке PIDFile файла модуля SystemD ( /var/run/mongodb/mongod.pidдля меня)
Герт ван ден Берг
0

Следующее работало для меня:

/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но это должно быть простым дополнением
Томас Братт
источник
-1

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

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

Эрик Алдингер
источник
1
Кажется, Андрей уже прочитал эту документацию; ты на самом деле не отвечаешь на его вопрос.
Law29