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.cfg
en zoek de coderegels waar desystemLog
is 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.log
bestand - 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.exe
naar de locatie op uw systeem. - Sla het bestand op en zorg ervoor dat het pad in de
logrotate
configuratie is hetzelfde! (de lijn tussenpostrotate
enendscript
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.log
moeten zien . -
Open een terminal en controleer of logrotatie werkt (
-f
dwingt 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="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>
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.