Con l'aiuto di Wernfried-Domscheit , molte ricerche, settimane di tentativi ed errori e frustrazione ho trovato una soluzione funzionante su Windows.
Prerequisiti
- Hai un servizio MongoDB in esecuzione con un file di configurazione
mongod.cfg
- LogRotateWin è installato. Questo è un pacchetto di terze parti per ruotare i file di registro, basato sull'implementazione unix. Fornisce molte funzionalità personalizzabili come la compressione, l'applicazione della rotazione, l'eliminazione di vecchi file e altro ancora. Puoi trovare un elenco completo delle opzioni qui Configurazione LogRotateWin .
- Conoscenza di base del programma di pianificazione delle attività di Windows.
- Conoscenza di base dei file bat.
1. Modifica il file di configurazione del servizio MongoDB
- Interrompi il servizio
- Apri il
mongod.cfg
e trova le righe di codice in cui si trova ilsystemLog
è configurato:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: E:\MongoDB\Server\4.4\log\mongod.log
logRotate: reopen
Assicurati di sovrascrivere il percorso del tuo mongod.log
. Assicurati anche che logAppend: true
e logRotate: reopen
sono impostati.
- Elimina il
mongod.log
corrente file - Riavvia il servizio
2. Configura la configurazione logrotate
Questa è la mia configurazione. Puoi personalizzarlo in base alle tue esigenze. Ma non usare copy
, copytruncate
e create
e non rimuovi il postrotate
comandi! (Nel thread di discussione di SourceForge ho visto che notifempty
non funziona e rotate 10
risulta in errori di autorizzazione, vedi la mia modifica sotto questo post)
E:\MongoDB\Server\4.4\log\mongod.log {
nocompress
daily
size 100m
missingok
rotate 50
postrotate
E:\logrotate\notify_mongodb_service.bat
endscript
}
Questa configurazione ruota i log non compressi ogni giorno o se la dimensione supera i 100 megabyte. Vengono memorizzati un massimo di 50 registri, i file meno recenti verranno eliminati. Lo script post-rotazione verrà eseguito quando la rotazione è riuscita.
3. Crea il notify_mongodb_service.bat
file
Questo file invia un comando al servizio MongoDB, che verrà utilizzato un nuovo file. Se hai abilitato l'autorizzazione puoi aggiungere -u username -p password
anche.
E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
- Cambia il percorso in
mongo.exe
alla posizione sul tuo sistema. - Salva il file e assicurati che il percorso sia in
logrotate
la configurazione è la stessa! (la linea trapostrotate
eendscript
Il comando è archiviato in un file aggiuntivo, perché LogRotateWin interpreta le parentesi ({}
) del comando mongo e genera un'eccezione.
4. Verifica che tutto funzioni
-
Apri la cartella dei log. Dovresti vedere un unico file
mongod.log
. -
Apri un terminale e controlla che la logrotation funzioni (
-f
forza la logrotazione anche se nessun trigger è stato attivato):
logrotate logrotate.conf -f
Dovrebbe verificarsi un nuovo file di registro. (per me è mongod.log.1
)Il mongod.log
dovrebbe essere vuoto.
-
Attiva qualcosa che verrà registrato. Ad esempio, connettiti con monogdbCompass al tuo MongoDB.
-
Controlla
mongod.log
. La connessione dovrebbe essere registrata lì.
5. Crea un processo di pianificazione delle attività per eseguire periodicamente la logrotation
Non parlerò della creazione del programma di pianificazione, ma ecco un esempio della mia configurazione. Puoi importare quel file e modificarlo in base alle tue esigenze.
Cambia anche il percorso di logrotate.exe
alla tua posizione del tuo sistema.
Questo processo viene eseguito ogni ora per verificare se uno o più trigger di logrotate sono stati attivati:
<?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>
Spero di poter aiutare qualcuno con quella guida.
Modifica 01-05-2022
Ho affrontato il problema che logrotate
genera un'eccezione quando sono presenti più di 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>
La soluzione rapida per ora consiste nell'impostare un massimo di 9 file.