Como configurar a rotação de logs automática no MongoDB

O gerenciamento de logs é uma tarefa que está presente nos mais diversos sistemas, e precisa seguir uma série de boas práticas para que os dados para análise estejam disponíveis quando necessário, mas que também sejam descartados uma vez que não sejam mais úteis, evitando o acúmulo e uso de armazenamento desnecessário. Uma prática comum de controle de logs é o rotacionamento, que gera um novo log para escrita, e arquiva e apaga os logs antigos periodicamente.

O MongoDB, assim como outros bancos de dados, possui um log onde ele armazena informações, como erros, logins no banco e slow queries, que fica por padrão no caminho /var/log/mongodb/mongod.log. Ele também possui um log de auditoria, que é gerado caso a auditoria esteja habilitada (na versão Enterprise), e é definido pelo parâmetro auditLog.path do arquivo de configurações.

Parâmetros relacionados ao log

Alguns parâmetros relacionados ao logging podem ser configurados no arquivo de configuração /etc/mongod.conf:

systemLog.destination: o destino para o qual o MongoDB enviará as mensagens de output. Pode ser configurado para file (caso seja especificado, deve ser configurada o parâmetro systemLog.path) ou syslog;

systemLog.path: caminho do log do servidor, por padrão /var/log/mongodb/mongod.log;

systemLog.logAppend: quando setado para true quando o MongoDB reinicia, ele continua a escrever no log de servidor existente. Caso seja false, um novo log será criado;

systemLog.logRotate: determina o comportamento do comando logRotate quando fazendo a rotação do log do MongoDB. Aceita os valores:

  • rename: renomeia o log;
  • reopen: fecha e reabre o log, seguindo o padrão de rotacionamento do Linux. Case seja configurado com este valor, o parâmetro systemLog.logAppend deve ser configurado como true;

processManagement.pidFilePath: especifica o caminho do arquivo que armazena o PID do processo de background mongod. Embora não tenha uma associação direta com o logging, vamos utilizá-lo posteriormente na automação do logrotate.

Usando o comando logRotate

No Mongo, temos o comando administrativo logRotate, que permite realizar a rotação dos logs de servidor e de auditoria manualmente. Podemos executá-lo enquanto conectados ao database admin:

> use admin
< switched to db admin
> db.runCommand({logRotate : 1})
< { ok: 1 }

Também é possível através do comando rotacionar apenas um dos logs, seja de auditoria ou do servidor:

> db.adminCommand({logRotate: "audit" })
< { ok: 1 }
> db.adminCommand({logRotate: "server" })
< { ok: 1 }

Como configurar a rotação de logs automática

Para tornar automática a rotação dos logs, podemos utilizar uma ferramenta do Linux, o logrotate. Essa ferramenta visa centralizar a administração de logs de todo o ambiente Linux. Esse utilitário tem um arquivo de configuração, /etc/logrotate.conf, e um diretório, /etc/logrotate.d/, onde ficam armazenadas as políticas de rotação de logs para os serviços do servidor.

Antes de configurar uma política para o logrotate, precisamos verificar se os seguintes parâmetros assumem os respectivos valores:

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
  logRotate: reopen
processManagement: 
  pidFilePath: /var/run/mongodb/mongod.pid

Na sequência, criamos um arquivo mongodb no diretório /etc/logrotate.d/, e adicionamos o seguinte:

/var/log/mongodb/mongod.log {
  daily
  size 100M
  rotate 5
  missingok
  nocompress
  dateext
  notifempty
  create 640 mongod mongod
  sharedscripts
  postrotate
    /bin/kill -SIGUSR1 `cat /var/run/mongodb/mongod.pid 2>/dev/null` >/dev/null 2>&1
  endscript
}

Vamos entender as opções usadas:

  • /var/log/mongodb/mongod.log: regra válida para este arquivo de log. Os parâmetros dentro das chaves se aplicam a esse log;
  • daily: tenta realizar a rotação diariamente;
  • size 100M: a rotação irá ocorrer caso o arquivo de log tenha mais de 100MB;
  • rotate 5: mantém os últimos 5 arquivos rotacionados;
  • missingok: não retorna erro caso o arquivo não exista;
  • nocompress: não realiza compressão do log rotacionado;
  • notifempty: não realiza a rotação caso o arquivo esteja vazio;
  • dateext: adiciona a data de rotação ao fim do nome do arquivo rotacionado;
  • create 640 mongod mongod: cria um novo log com as permissões para o usuário do mongo;
  • sharedscripts: garante que o postrotate seja executado apenas uma vez;

No campo postrotate, temos:

  postrotate
    /bin/kill -SIGUSR1 `cat /var/run/mongodb/mongod.pid 2>/dev/null` >/dev/null 2>&1
  endscript

As linhas entre postrotate e endscript são executadas após o logrotate, e nesse caso, estão enviando um sinal SIGUSR1 para o processo background mongod, cujo PID foi extraído do caminho configurado no parâmetro processManagement.pidFilePath do Mongo. Quando o mongod recebe esse sinal ele realiza a execução de um logRotate. É aconselhável utilizar essa abordagem ao invés do parâmetro copytruncate do logrotate, para evitar perda de informações logadas.

Para entender o fluxo de rotação para esse caso:

  1. Diariamente a rotação será tentada, mas a rotação será realizada apenas se o tamanho do log for maior que 100MB;
  2. Quando rotacionado, o log atual será renomeado para algo como /var/log/mongodb/mongod.log-20250701, adicionando a data ao final, devido à opção dateext da política de rotação;
  3. Um novo arquivo /var/log/mongodb/mongod.log é criado, mas o processo mongod ainda está escrevendo seus logs no arquivo renomeado (antigo log), pois ele manteve o arquivo aberto;
  4. Após o processo mongod receber o sinal SIGUSR1, ele irá acionar o comando logRotate, que irá fechar o log antigo e abrir o novo log para escrita. Esse comportamento é o comportamento do parâmetro systemLog.logRotate quando configurado com o valor reopen.

Conclusão

A implementação do logrotate no Mongo é algo simples que pode fazer você evitar situações como encontrar um log gigantesco quando seu ambiente está com problemas, e tornar o troubleshooting mais lento devido à dificuldade de encontrar as informações necessárias em um arquivo tão grande (por experiência, não é a mais agradável das situações).

Espero que tenham gostado! Abaixo deixo algumas referências pra esse artigo:

Publicar comentário