Med hjälp av Wernfried-Domscheit , mycket forskning, veckor av försök och misstag och frustration jag kom på en fungerande lösning på Windows.
Förutsättningar
- Du har en MongoDB-tjänst som körs med en konfigurationsfil
mongod.cfg
- LogRotateWin är installerad. Detta är ett tredjepartspaket för att rotera loggfilerna, baserat på unix-implementeringen. Det tillhandahåller många anpassningsbara funktioner som komprimering, när rotation används, radering av gamla filer och mer. Du kan hitta en fullständig lista med alternativ här LogRotateWin-konfiguration .
- Grundläggande kunskaper om Windows Taskscheduler.
- Mycket grundläggande kunskaper om bat-filer.
1. Justera konfigurationsfilen för MongoDB-tjänsten
- Stoppa tjänsten
- Öppna
mongod.cfg
och hitta kodraderna därsystemLog
är konfigurerad:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: E:\MongoDB\Server\4.4\log\mongod.log
logRotate: reopen
Se till att du skriver över sökvägen till din mongod.log
. Se också till att logAppend: true
och logRotate: reopen
är inställda.
- Ta bort den nuvarande
mongod.log
fil - Starta om tjänsten
2. Konfigurera logrotate-konfigurationen
Det här är min konfiguration. Du kan anpassa det efter dina egna behov. Men använd inte copy
, copytruncate
och create
och inte ta bort postrotate
kommandon! (I diskussionstråden för SourceForge såg jag att notifempty
fungerar inte och rotate 10
resulterar i behörighetsfel, se min redigering nedanför detta inlägg)
E:\MongoDB\Server\4.4\log\mongod.log {
nocompress
daily
size 100m
missingok
rotate 50
postrotate
E:\logrotate\notify_mongodb_service.bat
endscript
}
Denna konfiguration roterar loggarna okomprimerade varje dag eller om storleken överskrider 100 megabyte. Maximalt 50 loggar lagras, äldre filer kommer att raderas. Det efterroterade skriptet kommer att köras när rotationen lyckades.
3. Skapa notify_mongodb_service.bat
fil
Denna fil skickar ett kommando till MongoDB-tjänsten att en ny fil kommer att användas. Om du aktiverade auktorisering kan du lägga till -u username -p password
likaså.
E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
- Ändra sökvägen till
mongo.exe
till platsen på ditt system. - Spara filen och se till att sökvägen i
logrotate
konfigurationen är densamma! (linjen mellanpostrotate
ochendscript
Kommandot lagras i en extra fil, eftersom LogRotateWin tolkar parenteserna ({}
) av mongo-kommandot och kastar ett undantag.
4. Kontrollera att allt fungerar
-
Öppna mappen med loggarna. Du bör se en enda fil
mongod.log
. -
Öppna en terminal och kontrollera att logrotation fungerar (
-f
tvingar fram logrotationen även om ingen trigger utlöstes):
logrotate logrotate.conf -f
En ny loggfil bör uppstå. (för mig är det mongod.log.1
) mongod.log
bör vara tom.
-
Utlösa något som kommer att loggas. Anslut till exempel med monogdbCompass till din MongoDB.
-
Kontrollera
mongod.log
. Anslutningen ska loggas där.
5. Skapa ett Taskscheduler-jobb för att köra logrotation med jämna mellanrum
Jag kommer inte att prata om att skapa en schemaläggare men här är ett exempel på min konfiguration. Du kan importera den filen och ändra den efter dina behov.
Ändra även sökvägen till logrotate.exe
till din plats på ditt system.
Det här jobbet körs varje timme för att kontrollera om en eller flera triggers av logrotate utlöstes:
<?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>
Jag hoppas att jag kunde hjälpa någon med den guiden.
Redigera 2022-05-01
Jag stötte på problemet att logrotate
kastar undantag när det finns fler än 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>
Snabbfix för nu är att ställa in maximalt 9 filer.