Rotacionando logs com logrotate

Tutoriais - 15/Jan/2020 - por João Almeida

Alguns dias atrás precisei procurar a respeito de um erro que estava acontecendo aqui no site da Campus Code. Basicamente uma pessoa estava tentando se inscrever nos treinamentos, mas um dos e-mails enviados automaticamente parecia não estar funcionando.

Ao acessar o log da aplicação (que é escrita em Ruby on Rails), percebi que havia um único arquivo de log e ele estava com mais de 300MB! Precisei fazer uma cópia do arquivo para o meu computador via scp para conseguir ler o log e encontrar o erro.

Naquele momento acendeu um alerta na minha cabeça! Os arquivos do nosso log deveriam estar rotacionando, mas esquecemos dessa configuração quando atualizamos o site para a versão atual.

O que significa rotacionar os logs?

Rotacionar os logs é um procedimento automatizado em que arquivos de log de uma aplicação são comprimidos, renomeados e até movidos de diretório de acordo com algumas regras pré-definidas. Esse processo permite que os logs mais recentes estejam sempre acessíveis, que arquivos antigos sejam armazenados em um lugar mais adequado e até mesmo que logs muito antigos sejam descartados automaticamente.

Pode parecer simples, mas logs podem facilmente acumular centenas de megabytes ou até dezenas de gigabytes e ficarem impossíveis de serem consultados, especialmente ao levarmos em conta que servidores de produção geralmente só possuem ferramentas muito simples para leitura de arquivos.

Como rotacionar logs

Em servidores Linux, como Ubuntu Server ou Debian, a ferramenta logrotate já vem instalada e você só precisa configurá-la. Um dos aspectos mais interessantes do logrotate é que ele funciona para qualquer tipo de arquivo de texto, produzido por qualquer aplicação independente da tecnologia.

Para começar, você vai precisar editar o arquivo /etc/logrotate.conf. Ao abrir esse arquivo, insira ao final um novo bloco. Esse bloco deve ser declarado com o caminho completo no sistema operacional até o arquivo de log que você deseja rotacionar. Caso sua aplicação produza mais de um arquivo você pode descrever uma regra válida para todos arquivos, como *.log.

/caminho/para/sua/app/logs/*.log {

}

Dentro desse bloco você vai configurar as regras para rotacionar seus logs. São diversas opções e você pode encontrar todas na documentação, mas vou resumir as principais aqui:

  • daily/weekly/monthly/yearly: rotacionar o log diariamente, semanalmente, mensalmente ou anualmente.
  • size X: rotacionar os logs ao atingir um tamanho X no disco. O tamanho pode ser definido como 100 k, 100 M ou 2 G, sendo k referente a kylobytes, M a megabytes e G a gigabytes.
  • rotate X: manter os últimos X arquivos de log e descartar os mais antigos.
  • missingok: caso o arquivo de log não tenha sido criado, ignorar e não produzir erro.
  • compress: ao executar a rotação, comprime os arquivos com GZip.
  • delaycompress: rotacionar o arquivo em um dia e executar a compressão no dia seguinte, evitando assim problemas ao tentar comprimir arquivos que ainda estão sendo usados para escrita.
  • notifempty: não executar a rotação caso o arquivo esteja vazio.
  • copytruncate: ao rotacionar, copiar o conteúdo do arquivo atual de log para outro arquivo e depois apagar o conteúdo. Isso evita problemas de sincronização da sua aplicação com o arquivo de log.
  • mail X: envia um e-mail para o endereço X com os arquivos que deveriam ser removidos na rotação.

Exemplo de configuração

Abaixo, segue um exemplo de configuração para que os arquivos sejam rotacionados diariamente, mantidos por 14 dias, comprimidos para GZip e já prevenindo alguns erros durante a execução do logrotate.

/caminho/para/sua/app/logs/*.log {
  daily
  rotate 14
  missingok
  compress
  delaycompress
  copytruncate
  notifempty
}

Como executar o logrotate

O comando logrotate já vem pré-configurado para ser executado diariamente usando cron, mas, para testar sua configuração, você deseja executá-lo agora com seu arquivo de configuração atualizado, certo?

Para isso execute:

sudo /usr/sbin/logrotate -f /etc/logrotate.conf

Em seguida, vá até o diretório contendo os logs e verifique se as regras foram aplicadas :)

Foto de perfil do autor
João Almeida

Dev e instrutor na Campus Code