Mongodb - właściwy sposób na obracanie dzienników

13

Mongo docs powiedzieć, że mogę:

  1. użyj sygnału -SIGUSR1 i zmień nazwę starego dziennika i włącz prąd
  2. użyj logrotate z systemu operacyjnego

Chcę logrotate systemu operacyjnego do spakowania starych plików i usuwania najstarszych, ale nie widzę sposobu, aby powiedzieć mongod procesowi zmiany bieżącego dziennika poza wysłaniem SIGUSR1.

Więc napisałem

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

do /etc/logrotate.d/mongo.

A teraz uzyskaj dobrze nazwane logi z logrotate i puste logi jak mongodb.log.2013-09-18T23-49-44ślady przełączania SIGUSR1. Jak się tego pozbyć?

Andrey Regentov
źródło

Odpowiedzi:

11

copytruncate działa całkiem dobrze w przypadku logrotacji.

konfiguracja podobna do tej powinna wykonać zadanie za Ciebie:

/var/log/mongodb/*.log {
  daily
  missingok
  rotate 5
  compress
  dateext
  delaycompress
  copytruncate
  notifempty
}
steveberryman
źródło
1
Nie działało to dla mnie w RedHat 6.5. Dzienniki zostały obrócone, ale oryginalny plik .log nadal powiększał się bez ograniczeń.
Thomas Bratt
@ThomasBratt jest to poprawne, ponieważ bez ponownego uruchamiania procesów mongo obsługa plików pozostaje otwarta. fwics ta metoda nie będzie działać tak dobrze.
Mxx
@ThomasBratt spójrz na tę odpowiedź stackoverflow.com/a/8396266/949859
Mxx
1
@Mxx Niezłe znalezisko - wygląda na to, że copytruncate będzie działać z krokiem postrotate, aby zasygnalizować Mongo, aby obciął plik dziennika
Thomas Bratt
16

Od wersji mongodb 3.0 możesz zmienić zachowanie mongodb za pomocą parametru logRotate, zmień w /etc/mongod.conf

systemLog:
  logAppend: true
  logRotate: reopen

Zobacz także Podręczniki Mongo .

Następnie możesz użyć tej konfiguracji 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
źródło
Prawdopodobnie należy użyć pliku PID utworzonego z pliku konfiguracyjnego ... Zobacz processManagement.pidFilePathustawienie PIDFile pliku konfiguracyjnego lub pliku jednostki SystemD ( /var/run/mongodb/mongod.piddla mnie)
Gert van den Berg
15

Serwer zawiesił się dla mnie, jeśli wysyłasz SIGUSR1 do mongod po tym, jak usunąłeś plik dziennika z drogi za pomocą logrotate.

Poniższa konfiguracja jest bezpieczna dla wersji, którą przetestowałem - 2.6.6 na Ubuntu 12.04 - poprzednie przykłady spowodowały awarię serwera. Umieść to w /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
}

Zobacz: https://jira.mongodb.org/browse/SERVER-11087, aby uzyskać więcej szczegółów i sugestię od Akshay Kumar, której użyłem powyżej (użyj create zamiast nocreate i cp / dev / null do pliku dziennika).

W późniejszych wersjach powinna istnieć opcja logRotate, której możesz użyć do ponownego otwarcia pliku - nie zmieniaj jego nazwy - co obejdzie problem zmiany nazwy - ale nie działało to w mojej wersji (nie było obsługiwane).

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

Przetestowałem to z

logrotate -v -f /etc/logrotate.d/mongod
Bill Ryder
źródło
Działa świetnie dla mnie w Mongo 2.6.11 na CentOS 7
Tim
Musiałem zamienić mongodb.log na mongod.log i to działa
cwhisperer
Może potwierdzić, że jeśli systemLog.logRotate: reopenw mongod.conf, pkill będzie działał zgodnie z przeznaczeniem i nie jest wymagane usuwanie pliku dziennika o zmienionej nazwie, ponieważ żaden nie jest tworzony.
Julian H. Lam
0

Dla mnie działało:

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

Uwagi:

  • Testowane na RedHat 6.5
  • Jedynym sposobem na uzyskanie działającego rozwiązania było usunięcie pustych plików dziennika, które produkuje Mongo
  • Lokalizacja pliku blokady zależy od sposobu instalacji MongoDB
  • killjest wbudowany w Bash, ale logrotate działa poniżej /bin/sh- co nie rozpoznaje SIGUSR1w RedHat 6.5
  • Nie testowałem, compressale powinien być prostym dodatkiem
Thomas Bratt
źródło
-1

Zauważ, że w wersji 3.0 i wyższej nie jest wymagane zabicie demona bazy danych po prostu obrócenie dziennika. Zobacz dokumentację tutaj:

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

Eric Aldinger
źródło
1
Wygląda na to, że Andrey już przeczytał tę dokumentację; tak naprawdę nie odpowiadasz na jego pytanie.
Law29