Mongodb - правильний спосіб обертання журналів


13

Документи Монго кажуть, що я можу:

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

Я хочу, щоб система логротету ОС зберігала старі файли та видаляла найдавніші, але не бачу способу сказати процесу 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.

А тепер отримайте добре названі логіни з логротатних та порожніх журналів, як mongodb.log.2013-09-18T23-49-44сліди перемикання SIGUSR1. Як позбутися останнього?

Відповіді:


11

copytruncate працює досить добре для логротації.

конфігурація, аналогічна цій, повинна виконати цю роботу за вас:

/var/log/mongodb/*.log {
  daily
  missingok
  rotate 5
  compress
  dateext
  delaycompress
  copytruncate
  notifempty
}

1
Це не спрацювало для мене на RedHat 6.5. Журнали поверталися, але початковий файл .log продовжував рости без прив’язки.
Томас Братт

@ThomasBratt це правильно, оскільки без перезапуску процесів mongo обробник файлів залишається відкритим. fwics цей метод не буде працювати все так добре.
Mxx

@ThomasBratt подивіться на цю відповідь stackoverflow.com/a/8396266/949859
Mxx

1
@Mxx Приємна знахідка - схоже, що copytruncate буде працювати з кроком postrotate, щоб подати сигнал Монго, щоб урізати журнал
Thomas Bratt

16

Оскільки mongodb 3.0 ви можете змінити поведінку mongodb за допомогою параметра logRotate, змінити в /etc/mongod.conf

systemLog:
  logAppend: true
  logRotate: reopen

Дивіться також Посібники з Монго .

Тоді ви можете використовувати цю конфігурацію логротату:

/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для мене)
Герт ван ден Берг,

15

Сервер зазнав аварії для мене, якщо ви надіслали SIGUSR1 до mongod після того, як ви перемістили файл журналу з шляху логротету.

Наступна конфігурація безпечна для перевіреної нами версії - 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 для отримання більш детальної інформації та пропозицію від Акшая Кумара, яку я використав у вищевказаному (використовуйте створення замість nocreate та cp / dev / null у лог-файл).

У пізніших випусках має бути опція logRotate, яку ви можете використати для повторного відкриття файлу - не перейменувати його - що вирішить проблему перейменування - але в моїй версії він не працював (він не підтримувався).

Дивіться: https://github.com/mongodb/mongo/commit/616461d294bd9f5054ca38b302b6fc5d70fde20c

Я це перевірив

logrotate -v -f /etc/logrotate.d/mongod

Для мене чудово працює в Монго 2.6.11 на CentOS 7
Тім

Мені довелося замінити mongodb.log на mongod.log, і він працює
cwhisperer

Можна підтвердити, що якщо systemLog.logRotate: reopenв mongod.conf, тоді pkill працюватиме за призначенням і не потрібно видаляти перейменований файл журналу, оскільки жоден не створюється.
Julian H. Lam Lam

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, але логротат працює під /bin/sh- який не розпізнає SIGUSR1на RedHat 6.5
  • Я не compressпроходив тестування, але це повинно бути прямим доповненням

-1

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

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


1
Здається, Андрій уже прочитав цю документацію; ти насправді не відповідаєш на його запитання.
Закон29
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.