MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

la rotazione del registro mongo non funziona su Windows

Con l'aiuto di Wernfried-Domscheit , molte ricerche, settimane di tentativi ed errori e frustrazione ho trovato una soluzione funzionante su Windows.

Prerequisiti
  • Hai un servizio MongoDB in esecuzione con un file di configurazione mongod.cfg
  • LogRotateWin è installato. Questo è un pacchetto di terze parti per ruotare i file di registro, basato sull'implementazione unix. Fornisce molte funzionalità personalizzabili come la compressione, l'applicazione della rotazione, l'eliminazione di vecchi file e altro ancora. Puoi trovare un elenco completo delle opzioni qui Configurazione LogRotateWin .
  • Conoscenza di base del programma di pianificazione delle attività di Windows.
  • Conoscenza di base dei file bat.
1. Modifica il file di configurazione del servizio MongoDB
  1. Interrompi il servizio
  2. Apri il mongod.cfg e trova le righe di codice in cui si trova il systemLog è configurato:
# where to write logging data. 
systemLog:
      destination: file
      logAppend: true
      path:  E:\MongoDB\Server\4.4\log\mongod.log
      logRotate: reopen

Assicurati di sovrascrivere il percorso del tuo mongod.log . Assicurati anche che logAppend: true e logRotate: reopen sono impostati.

  1. Elimina il mongod.log corrente file
  2. Riavvia il servizio
2. Configura la configurazione logrotate

Questa è la mia configurazione. Puoi personalizzarlo in base alle tue esigenze. Ma non usare copy , copytruncate e create e non rimuovi il postrotate comandi! (Nel thread di discussione di SourceForge ho visto che notifempty non funziona e rotate 10 risulta in errori di autorizzazione, vedi la mia modifica sotto questo post)

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

Questa configurazione ruota i log non compressi ogni giorno o se la dimensione supera i 100 megabyte. Vengono memorizzati un massimo di 50 registri, i file meno recenti verranno eliminati. Lo script post-rotazione verrà eseguito quando la rotazione è riuscita.

3. Crea il notify_mongodb_service.bat file

Questo file invia un comando al servizio MongoDB, che verrà utilizzato un nuovo file. Se hai abilitato l'autorizzazione puoi aggiungere -u username -p password anche.

E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
  • Cambia il percorso in mongo.exe alla posizione sul tuo sistema.
  • Salva il file e assicurati che il percorso sia in logrotate la configurazione è la stessa! (la linea tra postrotate e endscript

Il comando è archiviato in un file aggiuntivo, perché LogRotateWin interpreta le parentesi ({} ) del comando mongo e genera un'eccezione.

4. Verifica che tutto funzioni
  1. Apri la cartella dei log. Dovresti vedere un unico file mongod.log .

  2. Apri un terminale e controlla che la logrotation funzioni ( -f forza la logrotazione anche se nessun trigger è stato attivato):

logrotate logrotate.conf -f

Dovrebbe verificarsi un nuovo file di registro. (per me è mongod.log.1 )Il mongod.log dovrebbe essere vuoto.

  1. Attiva qualcosa che verrà registrato. Ad esempio, connettiti con monogdbCompass al tuo MongoDB.

  2. Controlla mongod.log . La connessione dovrebbe essere registrata lì.

5. Crea un processo di pianificazione delle attività per eseguire periodicamente la logrotation

Non parlerò della creazione del programma di pianificazione, ma ecco un esempio della mia configurazione. Puoi importare quel file e modificarlo in base alle tue esigenze.

Cambia anche il percorso di logrotate.exe alla tua posizione del tuo sistema.

Questo processo viene eseguito ogni ora per verificare se uno o più trigger di logrotate sono stati attivati:

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

Spero di poter aiutare qualcuno con quella guida.

Modifica 01-05-2022

Ho affrontato il problema che logrotate genera un'eccezione quando sono presenti più di 9 file:

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>

La soluzione rapida per ora consiste nell'impostare un massimo di 9 file.