sql >> Base de Datos >  >> NoSQL >> MongoDB

la rotación de registro de mongo no funciona en Windows

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
  1. Detener el servicio
  2. Abra mongod.cfg y busque las líneas de código donde systemLog 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.

  1. Eliminar el mongod.log actual archivo
  2. 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 entre postrotate y endscript

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
  1. Abra la carpeta de los registros. Debería ver un solo archivo mongod.log .

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

  1. Activar algo que se registrará. Por ejemplo, conéctese con monogdbCompass a su MongoDB.

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