Pesquisa de site

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.