Med hjælp fra Wernfried-Domscheit , en masse research, uger med forsøg og fejl og frustration fandt jeg ud af en fungerende løsning på Windows.
Forudsætninger
- Du har en MongoDB-Service, der kører med en konfigurationsfil
mongod.cfg
- LogRotateWin er installeret. Dette er en tredjepartspakke til at rotere logfilerne, baseret på unix-implementeringen. Det giver mange brugerdefinerbare funktioner som komprimering, når rotation anvendes, sletning af gamle filer og mere. Du kan finde en komplet liste over muligheder her LogRotateWin-konfiguration .
- Grundlæggende kendskab til Windows Taskscheduler.
- Meget grundlæggende viden om bat-filer.
1. Juster konfigurationsfilen for MongoDB-Service
- Stop tjenesten
- Åbn
mongod.cfg
og find kodelinjerne hvorsystemLog
er konfigureret:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: E:\MongoDB\Server\4.4\log\mongod.log
logRotate: reopen
Sørg for, at du overskriver stien til din mongod.log
. Vær også sikker på, at logAppend: true
og logRotate: reopen
er indstillet.
- Slet den nuværende
mongod.log
fil - Genstart tjenesten
2. Konfigurer logrotate-konfigurationen
Dette er min konfiguration. Du kan tilpasse det til dine egne behov. Men brug ikke copy
, copytruncate
og create
og ikke fjern postrotate
kommandoer! (I diskussionstråden til SourceForge så jeg den notifempty
virker ikke, og rotate 10
resulterer i tilladelsesfejl, se min redigering under dette indlæg)
E:\MongoDB\Server\4.4\log\mongod.log {
nocompress
daily
size 100m
missingok
rotate 50
postrotate
E:\logrotate\notify_mongodb_service.bat
endscript
}
Denne konfiguration roterer logfilerne ukomprimeret hver dag, eller hvis størrelsen oversteg 100 megabyte. Der gemmes maksimalt 50 logfiler, ældre filer vil blive slettet. Det efterroterede script vil blive udført, når rotationen lykkedes.
3. Opret notify_mongodb_service.bat
fil
Denne fil sender en kommando til MongoDB-tjenesten, at en ny fil vil blive brugt. Hvis du har aktiveret autorisation, kan du tilføje -u username -p password
også.
E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
- Skift stien til
mongo.exe
til placeringen på dit system. - Gem filen, og sørg for, at stien i
logrotate
konfigurationen er den samme! (linjen mellempostrotate
ogendscript
Kommandoen er gemt i en ekstra fil, fordi LogRotateWin fortolker parenteserne ({}
) af mongo-kommandoen og kaster en undtagelse.
4. Tjek, at alt fungerer
-
Åbn mappen med logfilerne. Du bør se en enkelt fil
mongod.log
. -
Åbn en terminal og kontroller, at logrotation fungerer (
-f
tvinger logrotationen, selvom ingen trigger blev udløst):
logrotate logrotate.conf -f
Der skulle opstå en ny logfil. (for mig er det mongod.log.1
) mongod.log
skal være tom.
-
Udløs noget, der vil blive logget. Forbind for eksempel med monogdbCompass til din MongoDB.
-
Tjek
mongod.log
. Forbindelsen skal logges der.
5. Opret et Taskscheduler-job for at køre logrotation med jævne mellemrum
Jeg vil ikke tale om oprettelse af opgaveplanlægning, men her er et eksempel på min konfiguration. Du kan importere den fil og ændre den til dine behov.
Skift også stien til logrotate.exe
til din placering af dit system.
Dette job kører hver time for at kontrollere, om en eller flere triggere af logrotate udløste:
<?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>
Jeg håber, jeg kunne hjælpe nogen med den guide.
Rediger 2022-05-01
Jeg stod over for det problem, at logrotate
kaster undtagelse, når der er mere end 9 filer:
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 for nu er at indstille maksimalt 9 filer.