Met de hulp van Wernfried-Domscheit , veel onderzoek, weken van vallen en opstaan en frustratie heb ik een werkende oplossing voor Windows bedacht.
Vereisten
- U heeft een MongoDB-service met een configuratiebestand
mongod.cfg - LogRotateWin is geinstalleerd. Dit is een pakket van derden om de logbestanden te roteren, gebaseerd op de unix-implementatie. Het biedt veel aanpasbare functionaliteiten zoals compressie, wanneer roteren wordt toegepast, het verwijderen van oude bestanden en meer. U kunt hier een volledige optielijst vinden LogRotateWin-configuratie .
- Basiskennis van Windows Taskscheduler.
- Zeer basiskennis van bat-bestanden.
1. Pas het configuratiebestand van de MongoDB-Service aan
- Stop de service
- Open de
mongod.cfgen zoek de coderegels waar desystemLogis geconfigureerd:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: E:\MongoDB\Server\4.4\log\mongod.log
logRotate: reopen
Zorg ervoor dat u het pad naar uw mongod.log . overschrijft . Zorg er ook voor dat logAppend: true en logRotate: reopen zijn ingesteld.
- Verwijder de huidige
mongod.logbestand - Herstart de service
2. Configureer de logrotate-configuratie
Dit is mijn configuratie. Dat kun je aanpassen aan je eigen wensen. Maar gebruik geen copy , copytruncate en create en niet verwijder de postrotate commando's! (In de discussiethread van SourceForge zag ik dat notifempty werkt niet en rotate 10 resulteert in toestemmingsfouten, zie mijn bewerking onder dit bericht)
E:\MongoDB\Server\4.4\log\mongod.log {
nocompress
daily
size 100m
missingok
rotate 50
postrotate
E:\logrotate\notify_mongodb_service.bat
endscript
}
Deze configuratie roteert de logboeken elke dag ongecomprimeerd of als de grootte 100 megabyte overschrijdt. Er worden maximaal 50 logs opgeslagen, oudere bestanden worden verwijderd. Het postrotate-script wordt uitgevoerd wanneer de rotatie is gelukt.
3. Maak de notify_mongodb_service.bat bestand
Dit bestand stuurt een commando naar de MongoDB-Service, dat een nieuw bestand zal worden gebruikt. Als je autorisatie hebt ingeschakeld, kun je -u username -p password . toevoegen ook.
E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
- Verander het pad naar
mongo.exenaar de locatie op uw systeem. - Sla het bestand op en zorg ervoor dat het pad in de
logrotateconfiguratie is hetzelfde! (de lijn tussenpostrotateenendscript
De opdracht wordt opgeslagen in een extra bestand, omdat de LogRotateWin de haakjes interpreteert ({} ) van het mongo-commando en gooit een Exception.
4. Controleer of alles werkt
-
Open de map met de logboeken. Je zou een enkel bestand
mongod.logmoeten zien . -
Open een terminal en controleer of logrotatie werkt (
-fdwingt de logrotatie zelfs als er geen trigger is geactiveerd):
logrotate logrotate.conf -f
Er zou een nieuw logbestand moeten verschijnen. (voor mij is het mongod.log.1 )De mongod.log moet leeg zijn.
-
Activeer iets dat wordt gelogd. Maak bijvoorbeeld verbinding met monogdbCompass naar uw MongoDB.
-
Controleer
mongod.log. De verbinding moet daar worden vastgelegd.
5. Maak een Taskscheduler-taak om periodiek logrotatie uit te voeren
Ik zal het niet hebben over het maken van takenplanners, maar hier is een voorbeeld van mijn configuratie. U kunt dat bestand importeren en aanpassen aan uw behoeften.
Verander ook het pad van de logrotate.exe naar uw locatie van uw systeem.
Deze taak wordt elk uur uitgevoerd om te controleren of een of meerdere triggers van logrotate zijn geactiveerd:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.4" xmlns="https://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>
Ik hoop dat ik iemand kan helpen met die gids.
Bewerk 2022-05-01
Ik liep tegen het probleem aan dat logrotate genereert uitzondering wanneer er meer dan 9 bestanden zijn:
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>
Quickfix is voorlopig om maximaal 9 bestanden in te stellen.