MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

rotasi log mongo tidak berfungsi di windows

Dengan bantuan Wernfried-Domscheit , banyak penelitian, berminggu-minggu coba-coba dan frustrasi, saya menemukan solusi yang berfungsi di windows.

Prasyarat
  • Anda menjalankan Layanan MongoDB dengan file konfigurasi mongod.cfg
  • LogRotateWin dipasang. Ini adalah paket pihak ketiga untuk memutar file log, berdasarkan implementasi unix. Ini menyediakan banyak fungsi yang dapat disesuaikan seperti kompresi, ketika rotasi diterapkan, penghapusan file lama dan banyak lagi. Anda dapat menemukan daftar opsi lengkap di sini Konfigurasi LogRotateWin .
  • Pengetahuan dasar Windows Taskscheduler.
  • Pengetahuan yang sangat mendasar tentang file bat.
1. Sesuaikan file konfigurasi Layanan MongoDB
  1. Hentikan layanan
  2. Buka mongod.cfg dan temukan baris kode di mana systemLog dikonfigurasi:
# where to write logging data. 
systemLog:
      destination: file
      logAppend: true
      path:  E:\MongoDB\Server\4.4\log\mongod.log
      logRotate: reopen

Pastikan Anda menimpa jalur ke mongod.log . Pastikan juga, bahwa logAppend: true dan logRotate: reopen diatur.

  1. Hapus mongod.log saat ini berkas
  2. Mulai ulang layanan
2. Konfigurasikan konfigurasi logrotate

Ini adalah konfigurasi saya. Anda dapat menyesuaikannya dengan kebutuhan Anda sendiri. Tapi jangan gunakan copy , copytruncate dan create dan jangan hapus postrotate perintah! (Di utas diskusi SourceForge saya melihat notifempty tidak berfungsi dan rotate 10 menghasilkan kesalahan izin, lihat hasil edit saya di bawah posting ini)

E:\MongoDB\Server\4.4\log\mongod.log {
  nocompress
  daily
  size 100m
  missingok
  rotate 50
  postrotate
    E:\logrotate\notify_mongodb_service.bat
  endscript
}

Konfigurasi ini memutar log yang tidak dikompresi setiap hari atau jika ukurannya melebihi 100 megabita. Maksimal 50 log disimpan, file lama akan dihapus. Skrip postrotate akan dijalankan ketika rotasi berhasil.

3. Buat notify_mongodb_service.bat berkas

File ini mengirimkan perintah ke MongoDB-Service, bahwa file baru akan digunakan. Jika Anda mengaktifkan otorisasi, Anda dapat menambahkan -u username -p password juga.

E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
  • Ubah jalur ke mongo.exe ke lokasi di sistem Anda.
  • Simpan file dan pastikan path di logrotate konfigurasinya sama! (garis antara postrotate dan endscript

Perintah disimpan dalam file tambahan, karena LogRotateWin menginterpretasikan Tanda Kurung ({} ) dari perintah mongo dan melempar Pengecualian.

4. Periksa apakah semuanya berfungsi
  1. Buka folder log. Anda akan melihat satu file mongod.log .

  2. Buka terminal dan periksa apakah logrotasi berfungsi ( -f memaksa logrotasi meskipun tidak ada pemicu yang dipicu):

logrotate logrotate.conf -f

File log baru akan muncul. (bagi saya ini adalah mongod.log.1 ) mongod.log harus kosong.

  1. Memicu sesuatu yang akan dicatat. Misalnya terhubung dengan monogdbCompass ke MongoDB Anda.

  2. Periksa mongod.log . Koneksi harus dicatat di sana.

5. Buat Tugas Penjadwal Tugas untuk menjalankan logrotasi secara berkala

Saya tidak akan berbicara tentang pembuatan penjadwal tugas tetapi ini adalah contoh konfigurasi saya. Anda dapat mengimpor file tersebut dan memodifikasinya sesuai kebutuhan Anda.

Ubah juga jalur logrotate.exe ke lokasi sistem Anda.

Pekerjaan ini berjalan setiap jam untuk memeriksa apakah satu atau beberapa pemicu logrotate dipicu:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2021-12-02T17:57:55.9541897</Date>
    <Author>Grayknife</Author>
    <Description>Execute Logrotate Hourly</Description>
    <URI>\docker\LogRotate</URI>
  </RegistrationInfo>
  <Triggers>
    <CalendarTrigger>
      <Repetition>
        <Interval>PT1H</Interval>
        <StopAtDurationEnd>false</StopAtDurationEnd>
      </Repetition>
      <StartBoundary>2021-12-02T18:00:00</StartBoundary>
      <ExecutionTimeLimit>PT30M</ExecutionTimeLimit>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>1234</UserId>
      <LogonType>Password</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
    <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>E:\logrotate\logrotate.exe</Command>
      <Arguments>logrotate.conf</Arguments>
      <WorkingDirectory>E:\logrotate</WorkingDirectory>
    </Exec>
  </Actions>
</Task>

Saya harap saya bisa membantu seseorang dengan panduan itu.

Edit 01-05-2020

Saya menghadapi masalah yang logrotate melempar pengecualian ketika ada lebih dari 9 file:

E:\logrotate>E:\logrotate\logrotate.exe logrotate.conf -f
logrotate: Force option set to true
logrotate: Exception: Cannot create a file when that file already exists.

logrotate: StackTrace:    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.__Error.WinIOError()
   at System.IO.File.InternalMove(String sourceFileName, String destFileName, Boolean checkHost)
   at logrotate.Program.AgeOutRotatedFiles(logrotateconf lrc, FileInfo fi, String rotate_path)
   at logrotate.Program.RotateFile(logrotateconf lrc, FileInfo fi)
   at logrotate.Program.Main(String[] args)

E:\logrotate>E:\logrotate\logrotate.exe logrotate.conf -f
logrotate: Force option set to true
logrotate: Exception: Access to the path 'E:\MongoDB\Server\4.4\log\mongod.log.10' is denied.
logrotate: StackTrace:    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.File.InternalDelete(String path, Boolean checkHost)
   at System.IO.File.Delete(String path)
   at logrotate.Program.DeleteRotateFile(String m_filepath, logrotateconf lrc)
   at logrotate.Program.AgeOutRotatedFiles(logrotateconf lrc, FileInfo fi, String rotate_path)
   at logrotate.Program.RotateFile(logrotateconf lrc, FileInfo fi)
   at logrotate.Program.Main(String[] args)
E:\logrotate>

Perbaikan cepat untuk saat ini adalah menyetel maksimal 9 file.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Node + Mongoose:Dapatkan ID yang terakhir dimasukkan?

  2. Apakah pesanan penting di bson_iter_find di mongo c driver

  3. Mengapa Anda Masih Harus Menggunakan Mesin Penyimpanan MMAPv1 untuk MongoDB

  4. bagaimana saya bisa menemukan array nilai dalam agregasi $match dan mengelompokkan hasilnya?

  5. Format tanggal luwak