Mongodb - modo corretto per ruotare i registri


13

I documenti di Mongo dicono che posso:

  1. utilizzare il segnale -SIGUSR1 e ottenere il vecchio registro rinominato e la corrente commutata
  2. usa logrotate dal sistema operativo

Voglio la capacità di logrotate del sistema operativo di comprimere i vecchi file e rimuovere quelli più vecchi, ma non vedo alcun modo per dire al processo mongod di cambiare il registro corrente se non l'invio di SIGUSR1.

Così ho scritto

/var/log/mongodb/*.log {
    daily
    rotate 5
    compress
    dateext
    missingok
    notifempty
    sharedscripts
    postrotate
        /usr/bin/killall -SIGUSR1 mongod
        /usr/bin/killall -SIGUSR1 mongos
    endscript
}

su /etc/logrotate.d/mongo.

E ora ottieni file di registro ben noti da logrotate e file di registro vuoti mongodb.log.2013-09-18T23-49-44come tracce di commutazione SIGUSR1. Come sbarazzarsi di quest'ultimo?

Risposte:


11

copytruncate funziona abbastanza bene per il logrotation.

una configurazione simile a questa dovrebbe fare al caso tuo:

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

1
Questo non ha funzionato per me su RedHat 6.5. I log sono stati ruotati ma il file .log originale ha continuato a crescere senza limiti.
Thomas Bratt,

@ThomasBratt questo è corretto perché senza riavviare i processi mongo il gestore di file rimane aperto. Questo metodo non funzionerà molto bene.
Mxx,

@ThomasBratt dare un'occhiata a questa risposta stackoverflow.com/a/8396266/949859
Mxx

1
@Mxx Nice find - sembra che copytruncate funzionerà con un passo postrotate per segnalare a Mongo di troncare il file di registro
Thomas Bratt

15

Il server si è arrestato in modo anomalo se si invia SIGUSR1 a mongod dopo aver spostato il file di registro di mezzo con logrotate.

La seguente configurazione è sicura per la versione che ho testato - 2.6.6 su Ubuntu 12.04 - gli esempi precedenti hanno bloccato il server. Metti questo in /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
}

Vedi: https://jira.mongodb.org/browse/SERVER-11087 per maggiori dettagli e un suggerimento da Akshay Kumar che ho usato in precedenza (usa create invece di nocreate e cp / dev / null nel file di log).

Nelle versioni successive dovrebbe esserci un'opzione logRotate che puoi usare per riaprire il file - non rinominarlo - che aggirerà il problema di rinomina - ma non ha funzionato nella mia versione (non era supportato).

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

Ho provato questo con

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

Funziona benissimo per me in Mongo 2.6.11 su CentOS 7
Tim

Ho dovuto sostituire mongodb.log con mongod.log e funziona
cwhisperer,

Può confermare che se systemLog.logRotate: reopenin mongod.conf, allora il pkill funzionerà come previsto e non è richiesta la cancellazione del file di registro rinominato poiché non ne viene creato nessuno.
Julian H. Lam

15

Da mongodb 3.0 è possibile modificare il comportamento di mongodb con il parametro logRotate, cambiare in /etc/mongod.conf

systemLog:
  logAppend: true
  logRotate: reopen

Vedi anche i manuali Mongo .

Quindi è possibile utilizzare questa configurazione 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
}

Probabilmente dovrebbe essere usato un file PID creato dal file di configurazione .... Vedi processManagement.pidFilePathnell'impostazione PIDFile del file di unità config o SystemD ( /var/run/mongodb/mongod.pidper me)
Gert van den Berg

0

Per me ha funzionato:

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

Appunti:

  • Testato su RedHat 6.5
  • L'unico modo per ottenere una soluzione funzionante era eliminare i file di registro vuoti prodotti da Mongo
  • La posizione del file di blocco dipende da come è stato installato MongoDB
  • killè un Bash incorporato ma logrotate funziona sotto /bin/sh- che non riconosce SIGUSR1su RedHat 6.5
  • Non ho ancora testato, compressma dovrebbe essere un'aggiunta diretta

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.