MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

a rotação do log do mongo não funciona no Windows


Com a ajuda de Wernfried-Domscheit , muita pesquisa, semanas de tentativa e erro e frustração, descobri uma solução funcional no Windows.
Pré-requisitos
  • Você tem um serviço MongoDB em execução com um arquivo de configuração mongod.cfg
  • LogRotateWin está instalado. Este é um pacote de terceiros para rotacionar os arquivos de log, baseado na implementação do unix. Ele fornece muitas funcionalidades personalizáveis, como compactação, quando a rotação é aplicada, exclusão de arquivos antigos e muito mais. Você pode encontrar uma lista completa de opções aqui Configuração LogRotateWin .
  • Conhecimento básico do Agendador de Tarefas do Windows.
  • Conhecimento muito básico de arquivos bat.
1. Ajuste o arquivo de configuração do MongoDB-Service
  1. Parar o serviço
  2. Abra o mongod.cfg e encontre as linhas de código onde o systemLog está configurado:
# where to write logging data. 
systemLog:
      destination: file
      logAppend: true
      path:  E:\MongoDB\Server\4.4\log\mongod.log
      logRotate: reopen

Certifique-se de substituir o caminho para o seu mongod.log . Certifique-se também de que logAppend: true e logRotate: reopen estão prontos.
  1. Excluir o mongod.log atual arquivo
  2. Reiniciar o serviço
2. Configure a configuração do logrotate

Esta é a minha configuração. Você pode personalizar isso de acordo com suas próprias necessidades. Mas não use copy , copytruncate e create e não remova o postrotate comandos! (No tópico de discussão do SourceForge eu vi que notifempty não está funcionando e rotate 10 resulta em erros de permissão, veja minha edição abaixo deste post)
E:\MongoDB\Server\4.4\log\mongod.log {
  nocompress
  daily
  size 100m
  missingok
  rotate 50
  postrotate
    E:\logrotate\notify_mongodb_service.bat
  endscript
}

Essa configuração gira os logs descompactados todos os dias ou se o tamanho exceder 100 megabytes. Máximo de 50 logs são armazenados, os arquivos mais antigos serão excluídos. O script postrotate será executado quando a rotação for bem-sucedida.
3. Crie o notify_mongodb_service.bat arquivo

Este arquivo envia um comando para o MongoDB-Service, que um novo arquivo será usado. Se você ativou a autorização, pode adicionar -u username -p password também.
E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
  • Altere o caminho para mongo.exe para o local em seu sistema.
  • Salve o arquivo e certifique-se de que o caminho no logrotate a configuração é a mesma! (a linha entre postrotate e endscript

O comando é armazenado em um arquivo extra, pois o LogRotateWin interpreta os Brackets ({} ) do comando mongo e lança uma exceção.
4. Verifique se tudo está funcionando

  1. Abra a pasta dos logs. Você deve ver um único arquivo mongod.log .

  2. Abra um terminal e verifique se o logrotation está funcionando ( -f força o logrotation mesmo que nenhum trigger tenha sido acionado):
logrotate logrotate.conf -f

Um novo arquivo de log deve ocorrer. (para mim é mongod.log.1 )O mongod.log deve estar vazio.

  1. Acionar algo que será registrado. Por exemplo, conecte-se com monogdbCompass ao seu MongoDB.

  2. Verifique mongod.log . A conexão deve ser registrada lá.
5. Crie um Job do Agendador de Tarefas para executar o logrotation periodicamente

Eu não vou falar sobre a criação de taskscheduler mas aqui está um exemplo da minha configuração. Você pode importar esse arquivo e modificá-lo de acordo com suas necessidades.

Altere também o caminho do logrotate.exe para a localização do seu sistema.

Este trabalho é executado a cada hora para verificar se um ou vários gatilhos de logrotate foram acionados:
<?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 ajudar alguém com esse guia.

Editar 01-05-2022


Eu enfrentei o problema que logrotate lança exceção quando há mais de 9 arquivos:
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 enquanto é definir um máximo de 9 arquivos.