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
}

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
}

Вероятно, следует использовать файл 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.