MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Die Mongo-Protokollrotation funktioniert nicht unter Windows

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
  1. Beenden Sie den Dienst
  2. Öffnen Sie die mongod.cfg und finden Sie die Codezeilen, in denen das systemLog 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.

  1. Löschen Sie die aktuelle mongod.log Datei
  2. 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 zwischen postrotate und endscript

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
  1. Öffnen Sie den Ordner der Protokolle. Sie sollten eine einzelne Datei mongod.log sehen .

  2. Ö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.

  1. Lösen Sie etwas aus, das protokolliert wird. Verbinden Sie sich zum Beispiel mit monogdbCompass mit Ihrer MongoDB.

  2. Ü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.