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.cfg
i znajdź linie kodu, w którychsystemLog
jest 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.log
plik - 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.exe
do lokalizacji w twoim systemie. - Zapisz plik i upewnij się, że ścieżka w
logrotate
konfiguracja jest taka sama! (linia międzypostrotate
iendscript
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 (
-f
wymusza 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="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>
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.