S pomocí Wernfried-Domscheit , spousta výzkumu, týdny pokusů a omylů a frustrace Zjistil jsem funkční řešení pro Windows.
Předpoklady
- Máte spuštěnou službu MongoDB s konfiguračním souborem
mongod.cfg
- LogRotateWin je nainstalován. Toto je balíček třetí strany pro rotaci souborů protokolu na základě implementace unixu. Poskytuje mnoho přizpůsobitelných funkcí, jako je komprese, při použití rotace, mazání starých souborů a další. Úplný seznam možností naleznete zde Konfigurace LogRotateWin .
- Základní znalost nástroje Windows Taskscheduler.
- Velmi základní znalost souborů bat.
1. Upravte konfigurační soubor MongoDB-Service
- Zastavte službu
- Otevřete
mongod.cfg
a najděte řádky kódu, kde jesystemLog
je nakonfigurováno:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: E:\MongoDB\Server\4.4\log\mongod.log
logRotate: reopen
Ujistěte se, že jste přepsali cestu k vašemu mongod.log
. Ujistěte se také, že logAppend: true
a logRotate: reopen
jsou nastaveny.
- Smažte aktuální
mongod.log
soubor - Restartujte službu
2. Nakonfigurujte konfiguraci logrotate
Toto je moje konfigurace. Můžete si to přizpůsobit svým vlastním potřebám. Ale nepoužívejte copy
, copytruncate
a create
a ne odstranit postrotate
příkazy! (V diskusním vláknu SourceForge jsem viděl, že notifempty
nefunguje a rotate 10
vede k chybám oprávnění, viz moje úprava pod tímto příspěvkem)
E:\MongoDB\Server\4.4\log\mongod.log {
nocompress
daily
size 100m
missingok
rotate 50
postrotate
E:\logrotate\notify_mongodb_service.bat
endscript
}
Tato konfigurace otáčí nekomprimované protokoly každý den nebo pokud velikost přesáhne 100 megabajtů. Je uloženo maximálně 50 protokolů, starší soubory budou smazány. Skript postrotate se spustí, když rotace proběhne úspěšně.
3. Vytvořte soubor notify_mongodb_service.bat
soubor
Tento soubor odešle službě MongoDB-Service příkaz, že bude použit nový soubor. Pokud jste povolili autorizaci, můžete přidat -u username -p password
také.
E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
- Změňte cestu na
mongo.exe
do umístění ve vašem systému. - Uložte soubor a ujistěte se, že cesta je uvedena v
logrotate
konfigurace je stejná! (čára mezipostrotate
aendscript
Příkaz je uložen v extra souboru, protože LogRotateWin interpretuje závorky ({}
) příkazu mongo a vyvolá výjimku.
4. Zkontrolujte, zda vše funguje
-
Otevřete složku protokolů. Měli byste vidět jeden soubor
mongod.log
. -
Otevřete terminál a zkontrolujte, zda logrotation funguje (
-f
vynutí logrotaci, i když nebyl spuštěn žádný trigger):
logrotate logrotate.conf -f
Měl by vzniknout nový soubor protokolu. (pro mě je to mongod.log.1
)Program mongod.log
by měl být prázdný.
-
Spusťte něco, co bude zaznamenáno. Připojte se například pomocí monogdbCompass k vašemu MongoDB.
-
Zkontrolujte
mongod.log
. Připojení by tam mělo být zaprotokolováno.
5. Chcete-li pravidelně spouštět logrotation
, vytvořte úlohu Taskscheduler JobNebudu mluvit o vytváření taskcheduleru, ale zde je příklad mé konfigurace. Tento soubor můžete importovat a upravit podle svých potřeb.
Změňte také cestu souboru logrotate.exe
k umístění vašeho systému.
Tato úloha se spouští každou hodinu a kontroluje, zda se spustil jeden nebo více spouštěčů logrotate:
<?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>
Doufám, že bych mohl někomu pomoci s tímto průvodcem.
Upravit 2022-05-01
Čelil jsem problému, že logrotate
vyvolá výjimku, když je více než 9 souborů:
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>
Rychlá oprava nyní znamená nastavit maximálně 9 souborů.