Se olharmos o conteúdo de /var/log veremos muitos arquivos de logs de diversos programas. Em um sistema que gera vários logs, a administração desses arquivos pode ser bastante simplificada usando o logrotate. Se não houver gerência e os logs continuarem sendo registrados sem parar ou mantidos para sempre, eles acabarão esgotando espaço em disco do sistema de arquivos onde /var/log reside.
O logrotate renomeará ou compactará os arquivos de log quando uma condição for atendida para que o próximo evento(log) seja registrado em um arquivo vazio.
Instalando o logrotate
Sistemas Derivados do Debian, Ubuntu…
apt install logrotate -y
Sistemas Derivados do Red Hat, CentOS, Rocky Linux…
dnf install logrotate -y
Vai ser criado o arquvio /etc/logrotate.conf e o diretório /etc/logrotate.d
É bom, ao invés de alterarmos o arquivo /etc/logrotate.conf diretamente, criarmos arquivos terminados em .conf dentro de /etc/logrotate.d/
Todo arquivo .conf criado dentro de /etc/logrotate.d/ será automaticamente incluído dentro de /etc/logrotate.conf
É importante observar que as opções presentes em /etc/logrotate.d/*.conf substituem as do arquivo de configuração principal em caso de conflito.
Por padrão, a instalação do logrotate cria um arquivo crontab dentro de /etc/cron.daily chamado logrotate. Como é o caso dos outros 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, observe a linha que contém cron.daily em /etc/crontab ou /etc/anacrontab.
Configurando Logrotate no Linux
logrotate fornece várias diretivas para nos ajudar a configurar quando e como os logs serão rotacionados e o que deve acontecer logo depois.
Como exemplo, iremos gerenciar logos do apache. Se o arquivo não existir dentro de /etc/logrotate.d basta criá-lo. Criei usando touch /etc/logrotate.d/apache.conf
[root@oracle86 ~]# touch /etc/logrotate.d/apache.conf
Edite o arquivo usando nano ou vim
[root@oracle86 ~]# vim /etc/logrotate.d/apache.conf
e coloque o seguinte conteúdo:
/var/log/apache2/* { weekly rotate 3 size 10M compress delaycompress }
Vamos ver o significado de cada linha:
- /var/log/apache2/* a primeira linha indica que as diretivas dentro do bloco se aplicam a todos os logs dentro de /var/log/apache2
- weekly quer dizer semanalmente. significa que a ferramenta tentará girar os logs semanalmente. Outros valores possíveis são daily e monthly.
- rotate 3 indica que apenas 3 arquivos rotacionados devem ser mantidos. Assim, o arquivo mais antigo será removido na quarta execução subsequente.
- size=10M define o tamanho mínimo para que a rotação ocorra em 10M. Em outras palavras, cada log não será rotacionado até atingir 10 MB.
- compress e delaycompress são usados para informar que todos os logs girados, com exceção do mais recente, devem ser compactados.
Vamos executar um teste(dry-run) para ver o que o logrotate faria se fosse realmente executado agora. Use a opção -d seguida pelo arquivo de configuração. Você pode realmente executar o logrotate omitindo a opção -d. Execute logrotate -d /etc/logrotate.d/apache.conf
[root@oracle86 ~]# logrotate -d /etc/logrotate.d/apache.conf
Em vez de compactar os logs, poderíamos renomeá-los com a data em que foram rotacioandos. Para fazer isso, usaremos a diretiva dateext. Se nosso formato de data for diferente do padrão aaaammdd, podemos especificá-lo usando dateformat.
Podemos até impedir que a rotação aconteça se o log estiver vazi, para isso usamos notifempty.
Veja um exemplo usando logs de um programa chamado squid:
/var/log/squid/access.log { monthly create 0644 root root rotate 5 size=1M dateext dateformat -%d%m%Y notifempty mail maria@categoriaoutros.com.br }
Como podemos ver no exemplo, este log não precisou ser rotacionado. No entanto, quando a condição de tamanho for atendida (tamanho = 1M), o log rotacionado será renomeado access.log-25082023 (se o log foi girado em 25 de agosto de 2023) e o log principal (access.log) será criado com permissões de acesso definidas como 0644 e com root como proprietário e proprietário do grupo.
Finalmente, quando o número de logs chegar a 6, o log mais antigo será enviado para maria@categoriaoutros.com.br
Podemos também executar um comando personalizado quando a rotação ocorrer. Para fazer isso, coloque a linha com tal comando entre as diretivas postrotate e endscript. Por exemplo, vamos supor que queremos enviar um e-mail para o root quando qualquer um dos logs dentro de /var/log/myservice for girado. Vamos adicionar as linhas em vermelho a /etc/logrotate.d/squid.conf:
/var/log/myservice/* { monthly create 0644 root root rotate 5 size=1M postrotate echo "Uma rotacao de log ocorreu." | mail root endscript }
Para ancerrar esse artigo, apenas certifique-se de que o logrotate está configurado para ser executado como um trabalho no cron.