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
- Arrêter le service
- Ouvrez le
mongod.cfg
et trouvez les lignes de code où lesystemLog
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.
- Supprimer le
mongod.log
actuel fichier - 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 entrepostrotate
etendscript
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
-
Ouvrez le dossier des logs. Vous devriez voir un seul fichier
mongod.log
. -
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.
-
Déclenchez quelque chose qui sera enregistré. Par exemple, connectez-vous avec monogdbCompass à votre MongoDB.
-
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.