Con la ayuda de Wernfried-Domscheit , mucha investigación, semanas de prueba y error y frustración, descubrí una solución funcional en Windows.
Requisitos
- Tiene un servicio MongoDB ejecutándose con un archivo de configuración
mongod.cfg
- LogRotateWin esta instalado. Este es un paquete de terceros para rotar los archivos de registro, basado en la implementación de Unix. Proporciona muchas funcionalidades personalizables como compresión, cuando se aplica la rotación, eliminación de archivos antiguos y más. Puede encontrar una lista completa de opciones aquí Configuración de LogRotateWin .
- Conocimiento básico del programador de tareas de Windows.
- Conocimiento muy básico de archivos bat.
1. Ajuste el archivo de configuración del servicio MongoDB
- Detener el servicio
- Abra
mongod.cfg
y busque las líneas de código dondesystemLog
está configurado:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: E:\MongoDB\Server\4.4\log\mongod.log
logRotate: reopen
Asegúrese de sobrescribir la ruta a su mongod.log
. Asegúrese también de que logAppend: true
y logRotate: reopen
están configurados.
- Eliminar el
mongod.log
actual archivo - Reiniciar el servicio
2. Configure la configuración de logrotate
Esta es mi configuración. Puede personalizar eso según sus propias necesidades. Pero no uses copy
, copytruncate
y create
y no eliminar el postrotate
comandos! (En el hilo de discusión de SourceForge vi que notifempty
no funciona y rotate 10
da como resultado errores de permiso, vea mi edición debajo de esta publicación)
E:\MongoDB\Server\4.4\log\mongod.log {
nocompress
daily
size 100m
missingok
rotate 50
postrotate
E:\logrotate\notify_mongodb_service.bat
endscript
}
Esta configuración rota los registros sin comprimir todos los días o si el tamaño supera los 100 megabytes. Se almacena un máximo de 50 registros, los archivos más antiguos se eliminarán. El script posterior a la rotación se ejecutará cuando la rotación se haya realizado correctamente.
3. Cree el notify_mongodb_service.bat
archivo
Este archivo envía un comando al servicio MongoDB, que se utilizará un nuevo archivo. Si habilitó la autorización, puede agregar -u username -p password
también.
E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
- Cambiar la ruta a
mongo.exe
a la ubicación en su sistema. - Guarde el archivo y asegúrese de que la ruta en el
logrotate
¡La configuración es la misma! (la línea entrepostrotate
yendscript
El comando se almacena en un archivo adicional, porque LogRotateWin interpreta los corchetes ({}
) del comando mongo y arroja una excepción.
4. Comprueba que todo funciona
-
Abra la carpeta de los registros. Debería ver un solo archivo
mongod.log
. -
Abra una terminal y verifique que logrotation esté funcionando (
-f
fuerza la logrotation incluso si no se activó ningún activador):
logrotate logrotate.conf -f
Debería aparecer un nuevo archivo de registro. (para mí es mongod.log.1
) El mongod.log
debe estar vacío.
-
Activar algo que se registrará. Por ejemplo, conéctese con monogdbCompass a su MongoDB.
-
Compruebe
mongod.log
. La conexión debe registrarse allí.
5. Cree un trabajo de Taskscheduler para ejecutar logrotation periódicamente
No hablaré sobre la creación del programador de tareas, pero aquí hay un ejemplo de mi configuración. Puede importar ese archivo y modificarlo según sus necesidades.
También cambia la ruta del logrotate.exe
a la ubicación de su sistema.
Este trabajo se ejecuta cada hora para comprobar si uno o varios activadores de logrotate activaron:
<?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>
Espero poder ayudar a alguien con esa guía.
Editar 2022-05-01
Enfrenté el problema de que logrotate
lanza una excepción cuando hay más de 9 archivos:
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 por ahora es establecer un máximo de 9 archivos.