MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

la rotation du journal mongo ne fonctionne pas sous windows

Avec l'aide de Wernfried-Domscheit , beaucoup de recherches, des semaines d'essais et d'erreurs et de frustration, j'ai trouvé une solution de travail sur Windows.

Prérequis
  • Vous avez un service MongoDB en cours d'exécution avec un fichier de configuration mongod.cfg
  • LogRotateWin est installé. Il s'agit d'un package tiers pour la rotation des fichiers journaux, basé sur l'implémentation Unix. Il fournit de nombreuses fonctionnalités personnalisables telles que la compression, l'application de la rotation, la suppression d'anciens fichiers, etc. Vous pouvez trouver une liste complète des options ici Configuration de LogRotateWin .
  • Connaissance de base du planificateur de tâches Windows.
  • Connaissance très basique des fichiers bat.
1. Ajustez le fichier de configuration du service MongoDB
  1. Arrêter le service
  2. Ouvrez le mongod.cfg et trouvez les lignes de code où le systemLog est configuré :
# where to write logging data. 
systemLog:
      destination: file
      logAppend: true
      path:  E:\MongoDB\Server\4.4\log\mongod.log
      logRotate: reopen

Assurez-vous d'écraser le chemin d'accès à votre mongod.log . Assurez-vous également que logAppend: true et logRotate: reopen sont définis.

  1. Supprimer le mongod.log actuel fichier
  2. Redémarrer le service
2. Configurez la configuration de la rotation des logs

C'est ma configuration. Vous pouvez personnaliser cela selon vos propres besoins. Mais n'utilisez pas copy , copytruncate et create et ne pas supprimer la postrotate commandes ! (Dans le fil de discussion de SourceForge, j'ai vu que notifempty ne fonctionne pas et rotate 10 résultats en erreurs d'autorisation, voir ma modification sous ce message)

E:\MongoDB\Server\4.4\log\mongod.log {
  nocompress
  daily
  size 100m
  missingok
  rotate 50
  postrotate
    E:\logrotate\notify_mongodb_service.bat
  endscript
}

Cette configuration fait tourner les journaux non compressés tous les jours ou si la taille dépasse 100 mégaoctets. Un maximum de 50 journaux sont stockés, les fichiers plus anciens seront supprimés. Le script de post-rotation sera exécuté lorsque la rotation aura réussi.

3. Créez le notify_mongodb_service.bat fichier

Ce fichier envoie une commande au service MongoDB, qu'un nouveau fichier sera utilisé. Si vous avez activé l'autorisation, vous pouvez ajouter -u username -p password aussi.

E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
  • Changer le chemin vers mongo.exe à l'emplacement sur votre système.
  • Enregistrez le fichier et assurez-vous que le chemin dans le logrotate la configuration est la même ! (la ligne entre postrotate et endscript

La commande est stockée dans un fichier supplémentaire, car LogRotateWin interprète les crochets ({} ) de la commande mongo et lève une exception.

4. Vérifiez que tout fonctionne
  1. Ouvrez le dossier des logs. Vous devriez voir un seul fichier mongod.log .

  2. Ouvrez un terminal et vérifiez que la rotation de log fonctionne ( -f force la logrotation même si aucun déclencheur n'a été déclenché) :

logrotate logrotate.conf -f

Un nouveau fichier journal doit apparaître. (pour moi c'est mongod.log.1 )Le mongod.log doit être vide.

  1. Déclenchez quelque chose qui sera enregistré. Par exemple, connectez-vous avec monogdbCompass à votre MongoDB.

  2. Vérifiez mongod.log . La connexion doit y être enregistrée.

5. Créez un Job Taskscheduler pour exécuter logrotation périodiquement

Je ne parlerai pas de création de planificateur de tâches mais voici un exemple de ma configuration. Vous pouvez importer ce fichier et le modifier selon vos besoins.

Changez également le chemin du logrotate.exe à l'emplacement de votre système.

Cette tâche s'exécute toutes les heures pour vérifier si un ou plusieurs déclencheurs de logrotate se sont déclenchés :

<?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>

J'espère que je pourrais aider quelqu'un avec ce guide.

Modifier 2022-05-01

J'ai rencontré le problème de logrotate lance une exception lorsqu'il y a plus de 9 fichiers :

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>

Le correctif rapide pour l'instant consiste à définir un maximum de 9 fichiers.