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
- Hentikan layanan
- Buka
mongod.cfg
dan temukan baris kode di manasystemLog
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.
- Hapus
mongod.log
saat ini berkas - 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 antarapostrotate
danendscript
Perintah disimpan dalam file tambahan, karena LogRotateWin menginterpretasikan Tanda Kurung ({}
) dari perintah mongo dan melempar Pengecualian.
4. Periksa apakah semuanya berfungsi
-
Buka folder log. Anda akan melihat satu file
mongod.log
. -
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.
-
Memicu sesuatu yang akan dicatat. Misalnya terhubung dengan monogdbCompass ke MongoDB Anda.
-
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.