Z pomocą Wernfried-Domscheit , wiele badań, tygodnie prób i błędów oraz frustracji wymyśliłem działające rozwiązanie w systemie Windows.
Wymagania wstępne
- Masz usługę MongoDB działającą z plikiem konfiguracyjnym
mongod.cfg - LogRotateWin jest zainstalowane. Jest to pakiet innej firmy do rotacji plików dziennika, oparty na implementacji uniksowej. Zapewnia wiele konfigurowalnych funkcji, takich jak kompresja, rotacja, usuwanie starych plików i inne. Pełną listę opcji znajdziesz tutaj Konfiguracja LogRotateWin .
- Podstawowa znajomość harmonogramu zadań Windows.
- Bardzo podstawowa wiedza na temat plików bat.
1. Dostosuj plik konfiguracyjny usługi MongoDB-Service
- Zatrzymaj usługę
- Otwórz plik
mongod.cfgi znajdź linie kodu, w którychsystemLogjest skonfigurowany:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: E:\MongoDB\Server\4.4\log\mongod.log
logRotate: reopen
Upewnij się, że nadpisałeś ścieżkę do swojego mongod.log . Upewnij się również, że logAppend: true i logRotate: reopen są ustawione.
- Usuń bieżący plik
mongod.logplik - Uruchom ponownie usługę
2. Skonfiguruj konfigurację logrotate
To jest moja konfiguracja. Możesz to dostosować do własnych potrzeb. Ale nie używaj copy , copytruncate i create i nie usuń postrotate polecenia! (W wątku dyskusji na SourceForge zobaczyłem, że notifempty nie działa i rotate 10 skutkuje błędami uprawnień, zobacz moją zmianę pod tym postem)
E:\MongoDB\Server\4.4\log\mongod.log {
nocompress
daily
size 100m
missingok
rotate 50
postrotate
E:\logrotate\notify_mongodb_service.bat
endscript
}
Ta konfiguracja powoduje rotację dzienników nieskompresowanych codziennie lub jeśli rozmiar przekracza 100 megabajtów. Przechowywanych jest maksymalnie 50 logów, starsze pliki zostaną usunięte. Skrypt postrotate zostanie wykonany, gdy rotacja się powiedzie.
3. Utwórz plik notify_mongodb_service.bat plik
Plik ten wysyła polecenie do usługi MongoDB, że zostanie użyty nowy plik. Jeśli włączyłeś autoryzację, możesz dodać -u username -p password również.
E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
- Zmień ścieżkę na
mongo.exedo lokalizacji w twoim systemie. - Zapisz plik i upewnij się, że ścieżka w
logrotatekonfiguracja jest taka sama! (linia międzypostrotateiendscript
Polecenie jest przechowywane w dodatkowym pliku, ponieważ LogRotateWin interpretuje nawiasy ({} ) polecenia mongo i zgłasza wyjątek.
4. Sprawdź, czy wszystko działa
-
Otwórz folder dzienników. Powinieneś zobaczyć pojedynczy plik
mongod.log. -
Otwórz terminal i sprawdź, czy działa rotacja logów (
-fwymusza logrotację, nawet jeśli nie został uruchomiony wyzwalacz):
logrotate logrotate.conf -f
Powinien pojawić się nowy plik dziennika. (dla mnie jest to mongod.log.1 ) mongod.log powinien być pusty.
-
Uruchom coś, co zostanie zarejestrowane. Na przykład połącz się za pomocą monogdbCompass z MongoDB.
-
Sprawdź
mongod.log. Połączenie powinno być tam zarejestrowane.
5. Utwórz zadanie harmonogramu zadań, aby okresowo uruchamiać rotację logów
Nie będę mówił o tworzeniu harmonogramu zadań, ale oto przykład mojej konfiguracji. Możesz zaimportować ten plik i zmodyfikować go do swoich potrzeb.
Zmień także ścieżkę logrotate.exe do Twojej lokalizacji systemu.
To zadanie jest uruchamiane co godzinę, aby sprawdzić, czy wyzwolono jeden lub wiele wyzwalaczy logrotate:
<?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>
Mam nadzieję, że pomogę komuś z tym przewodnikiem.
Edytuj 2022-05-01
Spotkałem się z problemem, który logrotate zgłasza wyjątek, gdy jest więcej niż 9 plików:
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>
Na razie Quickfix ma ustawić maksymalnie 9 plików.