Mit Hilfe von Wernfried-Domscheit , viel Recherche, wochenlanges Ausprobieren und Frustration, bis ich eine funktionierende Lösung für Windows gefunden habe.
Voraussetzungen
- Sie haben einen MongoDB-Dienst, der mit einer Konfigurationsdatei
mongod.cfg
läuft - LogRotateWin ist installiert. Dies ist ein Paket eines Drittanbieters zum Rotieren der Protokolldateien, basierend auf der Unix-Implementierung. Es bietet viele anpassbare Funktionen wie Komprimierung, Drehen beim Anwenden, Löschen alter Dateien und mehr. Eine vollständige Optionsliste finden Sie hier LogRotateWin-Konfiguration .
- Grundkenntnisse des Windows-Taskplaners.
- Sehr grundlegende Kenntnisse über bat-Dateien.
1. Passen Sie die Konfigurationsdatei des MongoDB-Service
an- Beenden Sie den Dienst
- Öffnen Sie die
mongod.cfg
und finden Sie die Codezeilen, in denen dassystemLog
ist konfiguriert:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: E:\MongoDB\Server\4.4\log\mongod.log
logRotate: reopen
Achten Sie darauf, dass Sie den Pfad zu Ihrer mongod.log
überschreiben . Achten Sie auch darauf, dass logAppend: true
und logRotate: reopen
eingestellt sind.
- Löschen Sie die aktuelle
mongod.log
Datei - Starten Sie den Dienst neu
2. Konfigurieren Sie die Logrotate-Konfiguration
Das ist meine Konfiguration. Sie können das an Ihre eigenen Bedürfnisse anpassen. Aber verwenden Sie nicht copy
, copytruncate
und create
und nicht entfernen Sie das postrotate
Befehle! (Im Diskussionsthread von SourceForge habe ich gesehen, dass notifempty
funktioniert nicht und rotate 10
führt zu Berechtigungsfehlern, siehe meine Bearbeitung unter diesem Beitrag)
E:\MongoDB\Server\4.4\log\mongod.log {
nocompress
daily
size 100m
missingok
rotate 50
postrotate
E:\logrotate\notify_mongodb_service.bat
endscript
}
Diese Konfiguration rotiert die Protokolle unkomprimiert jeden Tag oder wenn die Größe 100 Megabyte überschreitet. Es werden maximal 50 Protokolle gespeichert, ältere Dateien werden gelöscht. Das Postrotate-Skript wird ausgeführt, wenn die Rotation erfolgreich war.
3. Erstellen Sie die notify_mongodb_service.bat
Datei
Diese Datei sendet einen Befehl an den MongoDB-Service, dass eine neue Datei verwendet wird. Wenn Sie die Autorisierung aktiviert haben, können Sie -u username -p password
hinzufügen auch.
E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
- Ändern Sie den Pfad zu
mongo.exe
an den Speicherort auf Ihrem System. - Speichern Sie die Datei und stellen Sie sicher, dass der Pfad in der
logrotate
Konfiguration ist die gleiche! (die Zeile zwischenpostrotate
undendscript
Der Befehl wird in einer extra Datei gespeichert, da LogRotateWin die Klammern ({}
) des Mongo-Befehls und löst eine Ausnahme aus.
4. Überprüfen Sie, ob alles funktioniert
-
Öffnen Sie den Ordner der Protokolle. Sie sollten eine einzelne Datei
mongod.log
sehen . -
Öffnen Sie ein Terminal und prüfen Sie, ob die Logrotation funktioniert (
-f
erzwingt die Logrotation auch wenn kein Trigger ausgelöst wurde):
logrotate logrotate.conf -f
Eine neue Protokolldatei sollte auftreten. (bei mir ist es mongod.log.1
) Die mongod.log
sollte leer sein.
-
Lösen Sie etwas aus, das protokolliert wird. Verbinden Sie sich zum Beispiel mit monogdbCompass mit Ihrer MongoDB.
-
Überprüfen Sie
mongod.log
. Dort sollte die Verbindung protokolliert werden.
5. Erstellen Sie einen Taskscheduler-Job, um die Logrotation regelmäßig auszuführen
Ich werde nicht über die Taskplaner-Erstellung sprechen, aber hier ist ein Beispiel meiner Konfiguration. Sie können diese Datei importieren und an Ihre Bedürfnisse anpassen.
Ändern Sie auch den Pfad der logrotate.exe
zu Ihrem Standort Ihres Systems.
Dieser Job wird stündlich ausgeführt, um zu prüfen, ob ein oder mehrere Trigger von logrotate ausgelöst wurden:
<?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>
Ich hoffe, ich konnte jemandem mit dieser Anleitung helfen.
Bearbeiten 01.05.2022
Ich hatte das Problem, dass logrotate
löst eine Ausnahme aus, wenn mehr als 9 Dateien vorhanden sind:
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 ist vorerst maximal 9 Dateien einzustellen.