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 do arquivo de configurações.auditLog.path
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âmetrosystemLog.logAppenddeve ser configurado comotrue;
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:
- Diariamente a rotação será tentada, mas a rotação será realizada apenas se o tamanho do log for maior que 100MB;
- Quando rotacionado, o log atual será renomeado para algo como
/var/log/mongodb/mongod.log-20250701, adicionando a data ao final, devido à opçãodateextda política de rotação; - 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; - 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âmetrosystemLog.logRotatequando configurado com o valorreopen.
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