Mongodb - die richtige Art, Stämme zu drehen

13

Mongo Docs sagen, dass ich:

  1. Verwenden Sie das -SIGUSR1-Signal, um das alte Protokoll umzubenennen und den Strom zu wechseln
  2. benutze logrotate von OS

Ich möchte, dass das Betriebssystem in der Lage ist, alte Dateien zu komprimieren und die ältesten zu entfernen, sehe aber keine Möglichkeit, dem mongod-Prozess anzuweisen, das aktuelle Protokoll zu wechseln, außer SIGUSR1 zu senden.

Also schrieb ich

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

nach /etc/logrotate.d/mongo.

Und jetzt holen Sie sich gut benannte Logfiles aus logrotierten und leeren Logfiles wie mongodb.log.2013-09-18T23-49-44als Spuren des SIGUSR1-Switchings. Wie wird man letzteres los?

Andrey Regentov
quelle

Antworten:

11

copytruncate funktioniert ziemlich gut für die Logrotation.

Eine ähnliche Konfiguration sollte den Job für Sie erledigen:

/var/log/mongodb/*.log {
  daily
  missingok
  rotate 5
  compress
  dateext
  delaycompress
  copytruncate
  notifempty
}
steveberryman
quelle
1
Bei RedHat 6.5 hat das nicht funktioniert. Die Protokolle wurden gedreht, aber die ursprüngliche .log-Datei wuchs ungebunden weiter.
Thomas Bratt
@ThomasBratt Das ist richtig, denn ohne einen Neustart von Mongo-Prozessen bleibt der File-Handler geöffnet. Fwics diese Methode wird nicht allzu gut funktionieren.
Mxx
@ ThomasBratt werfen Sie einen Blick auf diese Antwort stackoverflow.com/a/8396266/949859
Mxx
1
@ Mxx Schöne Entdeckung - sieht aus, als würde copytruncate mit einem Postrotate-Schritt zusammenarbeiten, um Mongo zu signalisieren, die Protokolldatei zu kürzen
Thomas Bratt
15

Der Server ist für mich abgestürzt, wenn Sie SIGUSR1 an mongod senden, nachdem Sie die Protokolldatei mit logrotate aus dem Weg geräumt haben.

Die folgende Konfiguration ist sicher für die Version, die ich getestet habe - 2.6.6 auf Ubuntu 12.04 - die vorherigen Beispiele haben den Server zum Absturz gebracht. Fügen Sie dies in /etc/logrotate.d/mongod ein:

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

Siehe: https://jira.mongodb.org/browse/SERVER-11087 für weitere Details und einen Vorschlag von Akshay Kumar, den ich oben verwendet habe (benutze create anstelle von nocreate und cp / dev / null in der Logdatei).

In späteren Releases soll es eine logRotate-Option geben, mit der Sie die Datei erneut öffnen können - nicht umbenennen - wodurch das Umbenennungsproblem umgangen wird -, die in meiner Version jedoch nicht funktioniert hat (sie wurde nicht unterstützt).

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

Ich habe das mit getestet

logrotate -v -f /etc/logrotate.d/mongod
Bill Ryder
quelle
Funktioniert hervorragend für mich in Mongo 2.6.11 auf CentOS 7
Tim
Ich musste mongodb.log durch mongod.log ersetzen und es funktioniert
cwhisperer
Kann bestätigen , dass , wenn systemLog.logRotate: reopenin mongod.conf, dann wird der pkill wie vorgesehen funktionieren und keine Löschung der umbenannten Protokolldatei benötigt wird , da kein erstellt wird.
Julian H. Lam
15

Seit mongodb 3.0 können Sie das Verhalten von mongodb mit dem logRotate-Parameter in /etc/mongod.conf ändern

systemLog:
  logAppend: true
  logRotate: reopen

Siehe auch Mongo-Handbücher .

Dann können Sie diese Logrotate-Konfiguration verwenden:

/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
quelle
Eine aus der Konfigurationsdatei erstellte PID-Datei sollte wahrscheinlich verwendet werden. Siehe processManagement.pidFilePathin der Konfiguration oder in der PIDFile-Einstellung der SystemD-Einheitendatei ( /var/run/mongodb/mongod.pidfür mich)
Gert van den Berg,
0

Folgendes hat für mich funktioniert:

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

Anmerkungen:

  • Getestet mit RedHat 6.5
  • Die einzige Möglichkeit, eine funktionierende Lösung zu finden, bestand darin, die leeren Protokolldateien zu löschen, die Mongo erstellt
  • Der Speicherort der Sperrdatei hängt davon ab, wie MongoDB installiert wurde
  • killist ein eingebauter Bash, aber Logrotate läuft unter /bin/sh- was SIGUSR1RedHat 6.5 nicht erkennt
  • Ich habe nicht mit getestet, compressaber es sollte eine einfache Ergänzung sein
Thomas Bratt
quelle
-1

Beachten Sie, dass es in Version 3.0 und höher nicht erforderlich ist, Ihren Datenbank-Daemon zu beenden, um lediglich ein Protokoll zu drehen. Siehe Dokumentation hier:

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

Eric Aldinger
quelle
1
Es scheint, dass Andrej diese Dokumentation bereits gelesen hat; du beantwortest seine Frage nicht wirklich.
Law29