Como configurar e gerenciar a rotação de log usando Logrotate no Linux
Um dos diretórios mais interessantes (e talvez um dos mais importantes também) em um sistema Linux é /var/log
. De acordo com o Filesystem Hierarchy Standard, a atividade da maioria dos serviços em execução no sistema é gravada em um arquivo dentro deste diretório ou em um de seus subdiretórios.
Esses arquivos são conhecidos como logs e são a chave para examinar como o sistema está operando (e como ele se comportou no passado). Os registros também são a primeira fonte de informações que os administradores e engenheiros procuram durante a solução de problemas.
Se olharmos o conteúdo de /var/log
em um CentOS/RHEL/Fedora e Debian/Ubuntu (para variar), veremos os seguintes arquivos de log e subdiretórios.
Observe que o resultado pode ser um pouco diferente no seu caso, dependendo dos serviços em execução no(s) seu(s) sistema(s) e do tempo em que estão em execução.
Em RHEL/CentOS e Fedora
ls /var/log
No Debian e Ubuntu
ls /var/log
Em ambos os casos, podemos observar que alguns dos nomes de log terminam como esperado em “log ”, enquanto outros são renomeados usando uma data (por exemplo, maillog-20160822 no CentOS) ou compactado (considere auth.log.2.gz e mysql.log.1.gz no Debian).
Este não é um comportamento padrão baseado na distribuição escolhida, mas pode ser alterado à vontade usando diretivas nos arquivos de configuração, como veremos neste artigo.
Se os logs fossem mantidos para sempre, eles acabariam preenchendo o sistema de arquivos onde /var/log reside. Para evitar isso, o administrador do sistema pode usar um utilitário interessante chamado logrotate para limpar os logs periodicamente.
Em poucas palavras, logrotate renomeará ou compactará o log principal quando uma condição for atendida (mais sobre isso em um minuto) para que o próximo evento seja registrado em um arquivo vazio.
Além disso, ele removerá os arquivos de log “antigos” e manterá os mais recentes. Claro, cabe a nós decidir o que significa “antigo” e com que frequência queremos que o logrotate limpe os logs para nós.
Instalando Logrotate no Linux
Para instalar o logrotate, basta usar seu gerenciador de pacotes:
---------- On Debian and Ubuntu ----------
aptitude update && aptitude install logrotate
---------- On CentOS, RHEL and Fedora ----------
yum update && yum install logrotate
Vale a pena notar que o arquivo de configuração (/etc/logrotate.conf
) pode indicar que outras configurações mais específicas podem ser colocadas em arquivos .conf
individuais dentro /etc/logrotate.d.
Este será o caso se e somente se a seguinte linha existir e não estiver comentada:
include /etc/logrotate.d
Manteremos esta abordagem, pois ela nos ajudará a manter as coisas em ordem, e usaremos a caixa do Debiann para os seguintes exemplos.
Configurar Logrotate no Linux
Por ser uma ferramenta muito versátil, o logrotate fornece diversas diretivas para nos ajudar a configurar quando e como os logs serão rotacionados e o que deve acontecer logo em seguida.
Vamos inserir o seguinte conteúdo em /etc/logrotate.d/apache2.conf (observe que provavelmente você terá que criar esse arquivo) e examinar cada linha para indicar sua finalidade:
/var/log/apache2/* {
weekly
rotate 3
size 10M
compress
delaycompress
}
A primeira linha indica que as diretivas dentro do bloco se aplicam a todos os logs dentro de /var/log/apache2:
- semanalmente significa que a ferramenta tentará alternar os registros semanalmente. Outros valores possíveis são diários e mensais.
- rotate 3 indica que apenas 3 logs rotacionados devem ser mantidos. Assim, o arquivo mais antigo será removido na quarta execução subsequente.
- size=10M define o tamanho mínimo para a rotação ocorrer em 10M. Em outras palavras, cada log não será girado até atingir 10 MB.
- compress e delaycompress são usados para informar que todos os logs rotacionados, com exceção do mais recente, devem ser compactados.
Vamos executar um teste para ver o que o logrotate faria se fosse realmente executado agora. Use a opção -d
seguida do arquivo de configuração (na verdade você pode executar o logrotate omitindo esta opção):
logrotate -d /etc/logrotate.d/apache2.conf
Os resultados são mostrados abaixo:
Em vez de compactar os logs, poderíamos renomeá-los após a data em que foram rotacionados. Para fazer isso, usaremos a diretiva datext
. Se nosso formato de data for diferente do padrão yyyymmdd, podemos especificá-lo usando dateformat.
Observe que podemos até impedir que a rotação aconteça se o log estiver vazio com notifempty. Além disso, vamos dizer ao logrotate para enviar o registro rotacionado ao administrador do sistema ([email protegido] neste caso) para referência dele (isso exigirá a configuração de um servidor de e-mail, que é fora do escopo deste artigo).
Se quiser receber e-mails sobre o logrotate, você pode configurar o servidor de correio Postfix conforme mostrado aqui: Instalar o servidor de correio Postfix
Desta vez usaremos /etc/logrotate.d/squid.conf para girar apenas /var/log/squid/access.log:
/var/log/squid/access.log {
monthly
create 0644 root root
rotate 5
size=1M
dateext
dateformat -%d%m%Y
notifempty
mail [email
}
Como podemos ver na imagem abaixo, este log não precisou ser girado. No entanto, quando a condição de tamanho (size=1M for atendida), o log girado será renomeado como access.log-25082020 (se o log tiver sido girado em agosto 25, 2020) e o log principal (access.log) serão recriados com permissões de acesso definidas como 0644 e com root como proprietário e proprietário do grupo.
Por fim, quando o número de registros chegar a 6, o registro mais antigo será enviado para [email .
Agora, suponhamos que você queira executar um comando personalizado quando a rotação ocorrer. Para fazer isso, coloque a linha com esse comando entre as diretivas postrotate e endscript.
Por exemplo, suponhamos que queremos enviar um e-mail para o root quando qualquer um dos logs dentro de /var/log/myservice for alternado. Vamos adicionar as linhas em vermelho em /etc/logrotate.d/squid.conf:
/var/log/myservice/* {
monthly
create 0644 root root
rotate 5
size=1M
postrotate
echo "A rotation just took place." | mail root
endscript
}
Por último, mas não menos importante, é importante notar que as opções presentes em /etc/logrotate.d/*.conf
substituem aquelas no arquivo de configuração principal em caso de conflitos.
Logrotate e Cron
Por padrão, a instalação do logrotate cria um arquivo crontab dentro de /etc/cron.daily chamado logrotate. Assim como os demais arquivos crontab dentro deste diretório, ele será executado diariamente a partir das 6h25 se o anacron não estiver instalado.
Caso contrário, a execução começará por volta das 7h35. Para verificar, procure a linha que contém cron.daily em /etc/crontab ou /etc/anacrontab.
Resumo
Em um sistema que gera diversos logs, a administração de tais arquivos pode ser bastante simplificada usando o logrotate. Conforme explicamos neste artigo, ele irá girar, compactar, remover e enviar logs automaticamente periodicamente ou quando o arquivo atingir um determinado tamanho.
Apenas certifique-se de que ele esteja configurado para ser executado como um cron job e o logrotate tornará as coisas muito mais fáceis para você. Para obter mais detalhes, consulte a página do manual.
Você tem alguma dúvida ou sugestão sobre este artigo? Sinta-se à vontade para nos informar usando o formulário de comentários abaixo.