Mongodb - cara yang tepat untuk memutar log

13

Mongo docs mengatakan bahwa saya dapat:

  1. gunakan sinyal -SIGUSR1 dan dapatkan log lama diganti namanya dan saat ini diaktifkan
  2. gunakan logrotate dari OS

Saya ingin kemampuan logrotate OS untuk zip file lama dan menghapus tertua, tetapi tidak melihat cara untuk memberitahu proses mongod untuk beralih log saat ini selain mengirim SIGUSR1.

Jadi saya menulis

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

ke /etc/logrotate.d/mongo.

Dan sekarang dapatkan logfiles dengan nama baik dari logrotate dan kosongkan logfile seperti mongodb.log.2013-09-18T23-49-44jejak switching SIGUSR1. Bagaimana cara menyingkirkan yang terakhir?

Andrey Regentov
sumber

Jawaban:

11

copytruncate berfungsi cukup baik untuk logrotation.

konfigurasi yang mirip dengan ini harus melakukan pekerjaan untuk Anda:

/var/log/mongodb/*.log {
  daily
  missingok
  rotate 5
  compress
  dateext
  delaycompress
  copytruncate
  notifempty
}
steveberryman
sumber
1
Ini tidak berhasil untuk saya di RedHat 6.5. Log diputar tetapi file .log yang asli terus tumbuh tanpa terikat.
Thomas Bratt
@ThomasBratt ini benar karena tanpa me-restart proses mongo file handler tetap terbuka. Jika metode ini tidak akan bekerja dengan baik.
Mxx
@ThomasBratt lihat jawaban ini stackoverflow.com/a/8396266/949859
Mxx
1
@Mxx Penemuan bagus - sepertinya copytruncate akan bekerja dengan langkah postrotate untuk memberi sinyal ke Mongo untuk memotong logfile
Thomas Bratt
15

Server macet untuk saya jika Anda mengirim SIGUSR1 ke mongod setelah Anda memindahkan logfile dengan logrotate.

Konfigurasi berikut aman untuk versi yang telah saya uji - 2.6.6 di ubuntu 12.04 - contoh sebelumnya membuat server crash. Masukkan ini ke /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
}

Lihat: https://jira.mongodb.org/browse/SERVER-11087 untuk rincian lebih lanjut dan saran dari Akshay Kumar yang saya gunakan di atas (gunakan create bukan nocreate dan cp / dev / null ke logfile).

Dalam rilis selanjutnya seharusnya ada opsi logRotate yang dapat Anda gunakan untuk membuka kembali file - bukan mengganti nama - yang akan mengatasi masalah ganti nama - tetapi tidak berfungsi dalam versi saya (tidak didukung).

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

Saya sudah menguji ini dengan

logrotate -v -f /etc/logrotate.d/mongod
Bill Ryder
sumber
Bekerja sangat baik untuk saya dalam bahasa Mongo 2.6.11 pada CentOS 7
Tim
Saya harus mengganti mongodb.log dengan mongod.log dan berfungsi
cwhisperer
Dapat mengkonfirmasi bahwa jika systemLog.logRotate: reopendalam mongod.conf, maka pkill akan berfungsi sebagaimana dimaksud dan tidak ada penghapusan file log yang diubah namanya karena tidak ada yang dibuat.
Julian H. Lam
15

Karena mongodb 3.0 Anda dapat mengubah perilaku mongodb dengan parameter logRotate, ubah /etc/mongod.conf

systemLog:
  logAppend: true
  logRotate: reopen

Lihat juga Manual Mongo .

Kemudian Anda dapat menggunakan konfigurasi logrotate ini:

/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
sumber
File PID yang dibuat dari file config mungkin harus digunakan .... Lihat processManagement.pidFilePathdi config atau pengaturan PIDFile file unit SystemD ( /var/run/mongodb/mongod.piduntuk saya)
Gert van den Berg
0

Berikut ini bekerja untuk saya:

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

Catatan:

  • Diuji pada RedHat 6.5
  • Satu-satunya cara saya bisa mendapatkan solusi yang berfungsi adalah menghapus file-file log kosong yang diproduksi Mongo
  • Lokasi file kunci tergantung pada bagaimana MongoDB diinstal
  • killadalah Bash builtin tetapi logrotate berjalan di bawah /bin/sh- yang tidak dikenaliSIGUSR1 pada RedHat 6.5
  • Saya belum diuji dengan compresstetapi harus menjadi tambahan yang lurus
Thomas Bratt
sumber
-1

Perhatikan bahwa dalam versi 3.0 dan lebih tinggi tidak diperlukan untuk mematikan daemon database Anda hanya untuk memutar log. Lihat dokumentasi di sini:

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

Eric Aldinger
sumber
1
Tampaknya Andrey sudah membaca dokumentasi itu; Anda tidak benar-benar menjawab pertanyaannya.
Law29