Mongodb - bonne façon de faire tourner les journaux

13

Mongo docs dit que je peux:

  1. utiliser le signal -SIGUSR1 et obtenir l'ancien journal renommé et le courant commuté
  2. utiliser logrotate à partir du système d'exploitation

Je veux que la capacité de rotation du système d'exploitation du système d'exploitation pour compresser les anciens fichiers et supprimer les plus anciens, mais ne vois aucun moyen de dire au processus mongod de basculer le journal actuel autre que l'envoi de SIGUSR1.

J'ai donc écrit

/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.

Et maintenant, obtenez des fichiers journaux bien nommés à partir de logrotate et des fichiers journaux vides comme des mongodb.log.2013-09-18T23-49-44traces de commutation SIGUSR1. Comment se débarrasser de ce dernier?

Andrey Regentov
la source

Réponses:

11

copytruncate fonctionne plutôt bien pour logrotation.

une configuration similaire à celle-ci devrait faire le travail pour vous:

/var/log/mongodb/*.log {
  daily
  missingok
  rotate 5
  compress
  dateext
  delaycompress
  copytruncate
  notifempty
}
steveberryman
la source
1
Cela n'a pas fonctionné pour moi sur RedHat 6.5. Les journaux ont été tournés mais le fichier .log d'origine a continué de croître sans limite.
Thomas Bratt
@ThomasBratt c'est correct car sans redémarrer le gestionnaire de fichiers de processus mongo reste ouvert. fwics cette méthode ne fonctionnera pas très bien.
Mxx
@ThomasBratt jetez un oeil à cette réponse stackoverflow.com/a/8396266/949859
Mxx
1
@Mxx Nice find - on dirait que copytruncate fonctionnera avec l'étape a postrotate pour signaler à Mongo de tronquer le fichier journal
Thomas Bratt
15

Le serveur s'est bloqué pour moi si vous envoyez SIGUSR1 à mongod après avoir déplacé le fichier journal avec logrotate.

La configuration suivante est sûre pour la version que j'ai testée - 2.6.6 sur ubuntu 12.04 - les exemples précédents ont planté le serveur. Mettez ceci dans /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
}

Voir: https://jira.mongodb.org/browse/SERVER-11087 pour plus de détails et une suggestion d'Akshay Kumar que j'ai utilisée dans ce qui précède (utilisez create au lieu de nocreate et cp / dev / null dans le fichier journal).

Dans les versions ultérieures, il est censé y avoir une option logRotate que vous pouvez utiliser pour rouvrir le fichier - pas le renommer - qui contournera le problème de renommage - mais cela n'a pas fonctionné dans ma version (elle n'était pas prise en charge).

Voir: https://github.com/mongodb/mongo/commit/616461d294bd9f5054ca38b302b6fc5d70fde20c

Je l'ai testé avec

logrotate -v -f /etc/logrotate.d/mongod
Bill Ryder
la source
Fonctionne très bien pour moi dans Mongo 2.6.11 sur CentOS 7
Tim
J'ai dû remplacer mongodb.log par mongod.log et cela fonctionne
cwhisperer
Peut -elle confirmer que si systemLog.logRotate: reopendans mongod.conf, le pkill fonctionnera comme prévu et aucune suppression du fichier journal est renommé requise car est créé.
Julian H. Lam
15

Depuis mongodb 3.0, vous pouvez changer le comportement de mongodb avec le paramètre logRotate, changez dans /etc/mongod.conf

systemLog:
  logAppend: true
  logRotate: reopen

Voir aussi Mongo Manuals .

Ensuite, vous pouvez utiliser cette configuration 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
la source
Un fichier PID créé à partir du fichier de configuration devrait probablement être utilisé .... Voir processManagement.pidFilePathdans la configuration ou le paramètre PIDFile du fichier d'unité SystemD ( /var/run/mongodb/mongod.pidpour moi)
Gert van den Berg
0

Ce qui suit a fonctionné pour moi:

/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
}

Remarques:

  • Testé sur RedHat 6.5
  • La seule façon d'obtenir une solution de travail était de supprimer les fichiers journaux vides produits par Mongo
  • L'emplacement du fichier de verrouillage dépend de la façon dont MongoDB a été installé
  • killest un Bash intégré mais logrotate fonctionne sous /bin/sh- qui ne reconnaît pas SIGUSR1sur RedHat 6.5
  • Je n'ai pas testé avec compressmais ça devrait être un ajout direct
Thomas Bratt
la source
-1

Notez que dans la version 3.0 et supérieure, il n'est pas nécessaire de tuer votre démon de base de données simplement pour faire pivoter un journal. Consultez la documentation ici:

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

Eric Aldinger
la source
1
Il semble qu'Andrey ait déjà lu cette documentation; vous ne répondez pas vraiment à sa question.
Loi29