Mongodb - günlükleri döndürmenin uygun yolu


13

Mongo belgeleri şunları yapabileceğimi söylüyor:

  1. -SIGUSR1 sinyalini kullanın ve eski günlüğü yeniden adlandırın ve akım anahtarlayın
  2. işletim sisteminden logrotate kullan

İşletim sisteminin logrotate yeteneğinin eski dosyaları sıkıştırmasını ve en eskisini kaldırmasını istiyorum, ancak mongod işlemine SIGUSR1 göndermekten başka geçerli günlüğü değiştirmesini söylemenin bir yolunu görmüyorum.

Ben de yazdım

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

Ve şimdi mongodb.log.2013-09-18T23-49-44SIGUSR1 anahtarlama izleri gibi logrotate ve boş log dosyalarından iyi adlandırılmış log dosyaları alın. İkincisinden nasıl kurtulurum?

Yanıtlar:


11

copytruncate, logrotation için oldukça iyi çalışıyor.

buna benzer bir yapılandırma işi sizin için yapmalıdır:

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

1
Bu benim için RedHat 6.5'te işe yaramadı. Günlükler döndürüldü, ancak özgün .log dosyası bağlanmadan büyümeye devam etti.
Thomas Bratt

@ThomasBratt bu doğrudur çünkü mongo süreçleri yeniden başlatılmadan dosya işleyici açık kalır. fwics bu yöntem o kadar iyi çalışmayacak.
Mxx

@ThomasBratt bu cevaba bir göz atın stackoverflow.com/a/8396266/949859
Mxx

1
@Mxx Nice find - copytruncate, logfile'ı kesmek için Mongo'ya sinyal göndermek için bir postrotate adımı ile çalışacak gibi görünüyor
Thomas Bratt

16

Mongodb 3.0 olduğundan, mongodb'un davranışını logRotate parametresiyle değiştirebilirsiniz, /etc/mongod.conf dosyasında

systemLog:
  logAppend: true
  logRotate: reopen

Ayrıca bkz . Mongo Kılavuzları .

Sonra bu logrotate yapılandırmasını kullanabilirsiniz:

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

Yapılandırma dosyasından oluşturulan bir PID dosyası muhtemelen kullanılmalıdır .... Bkz processManagement.pidFilePath. Config veya SystemD birim dosyasının PIDFile ayarı ( /var/run/mongodb/mongod.pidbenim için)
Gert van den Berg

15

Logftate logrotate ile yol dışına taşındıktan sonra SIGUSR1 mongod için gönderirseniz sunucu benim için çöktü.

Aşağıdaki yapılandırma, test ettiğim sürüm için güvenlidir - ubuntu 12.04'te 2.6.6 - önceki örnekler sunucuyu kilitledi. Bunu /etc/logrotate.d/mongod içine koyun:

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

Daha fazla ayrıntı ve yukarıda kullandığım Akshay Kumar'ın önerisi için https://jira.mongodb.org/browse/SERVER-11087 adresine bakın (nocreate ve cp / dev / null yerine logfile yerine create komutunu kullanın).

Daha sonraki sürümlerde dosyayı yeniden açmak için kullanabileceğiniz bir logRotate seçeneği olması gerekiyordu - yeniden adlandırmıyorum - ki bu yeniden adlandırma sorunu etrafında işe yarayacak - ancak sürümümde çalışmadı (desteklenmedi).

Bkz. Https://github.com/mongodb/mongo/commit/616461d294bd9f5054ca38b302b6fc5d70fde20c

Bunu ile test ettim

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

CentOS 7'de Mongo 2.6.11'de benim için harika çalışıyor
Tim

Ben mongodb.log mongod.log ile değiştirmek zorunda kaldı ve işe yarıyor
cwhisperer

Eğer onaylayabilir systemLog.logRotate: reopende mongod.confamaçlanan ve hiçbiri oluşturulur olarak yeniden adlandırılmış günlük dosyasının hiçbir silme geçerli olduğu gibi, daha sonra pkill çalışacaktır.
Julian H. Lam

0

Aşağıdakiler benim için çalıştı:

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

Notlar:

  • RedHat 6.5 üzerinde test edildi
  • Çalışan bir çözüm elde etmenin tek yolu Mongo'nun ürettiği boş günlük dosyalarını silmekti
  • Kilit dosyasının konumu, MongoDB'nin nasıl kurulduğuna bağlıdır
  • killbir Bash yerleşkesi ama logrotate altında çalışır /bin/sh- bu SIGUSR1RedHat 6.5'i tanımaz
  • Test etmedim compressama çok zor bir ek olmalı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.