Um dos mais interessantes (e talvez um dos mais importantes também) directórios num sistema Linux é /var/log
. De acordo com o Filesystem Hierarchy Standard, a actividade da maioria dos serviços em execução no sistema são escritos num ficheiro dentro deste directório ou numa das suas subdirectorias.
Estes ficheiros são conhecidos como logs e são a chave para examinar como o sistema está a funcionar (e como se tem comportado no passado). Os registos são também a primeira fonte de informação onde administradores e engenheiros procuram enquanto resolvem problemas.
Se olharmos para o conteúdo de /var/log
num CentOS/RHEL/Fedora e Debian/Ubuntu (para variedade) veremos os seguintes ficheiros de registo e subdirectórios.
Por favor note 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 de execução dos mesmos.
Em RHEL/CentOS e Fedora
# ls /var/log
In Debian e Ubuntu
# ls /var/log
em ambos os casos, podemos observar que alguns dos nomes dos log terminam como esperado em “log”, enquanto outros são renomeados utilizando uma data (por exemplo, maillog-20160822 em CentOS) ou comprimidos (considere auth.log.2.gz e mysql.log.1.gz em Debian).
Este não é um comportamento padrão baseado na distribuição escolhida mas pode ser alterado à vontade usando directivas nos ficheiros de configuração, como veremos neste artigo.
Se os registos fossem mantidos para sempre, acabariam por preencher o sistema de ficheiros onde /var/log reside. A fim de evitar isso, o administrador do sistema pode usar um bom utilitário chamado logrotate para limpar os registos periodicamente.
Em poucas palavras, logrotate irá renomear ou comprimir o registo principal quando uma condição for satisfeita (mais sobre isso num minuto) de modo a que o próximo evento seja registado num ficheiro vazio.
Além disso, irá remover os ficheiros de registo “antigos” e manter os mais recentes. Naturalmente, podemos decidir o que significa “antigo” e com que frequência queremos que o logrotate limpe os registos por nós.
Instalar logrotate no Linux
Para instalar logrotate, basta usar o seu gestor de pacotes:
---------- On Debian and Ubuntu ---------- # aptitude update && aptitude install logrotate ---------- On CentOS, RHEL and Fedora ---------- # yum update && yum install logrotate
Vale a pena e bem notar que o ficheiro de configuração (/etc/logrotate.conf
) pode indicar que outras configurações, mais específicas, podem ser colocadas em ficheiros individuais .conf
dentro de /etc/logrotate.d.
This will be the case if and only if the following line exists and is not commmented out:
include /etc/logrotate.d
We will stick with this approach, as it will help us to keep things in order, and use the Debian box for the following examples.
Configure Logrotate in Linux
Sendo uma ferramenta muito versátil, o logrotate fornece muitas directivas para nos ajudar a configurar quando e como os logs serão rodados, e o que deverá acontecer logo a seguir.
Ensira o seguinte conteúdo em /etc/logrotate.d/apache2.conf (note que muito provavelmente terá de criar esse ficheiro) e examine cada linha para indicar a sua finalidade:
/var/log/apache2/* { weekly rotate 3 size 10M compress delaycompress}
A primeira linha indica que as directivas dentro do bloco se aplicam a todos os registos dentro de /var/log/apache2:
- semanalmente significa que a ferramenta tentará rodar os registos numa base semanal. Outros valores possíveis são diários e mensais.
- rotate 3 indica que apenas 3 toros rotacionados devem ser mantidos. Assim, o ficheiro mais antigo será removido na quarta execução subsequente.
- tamanho=10M define o tamanho mínimo para que a rotação tenha lugar a 10M. Por outras palavras, cada registo não será rodado até atingir 10MB.
- comprimir e retardarcomprimir para dizer que todos os registos rodados, com excepção do mais recente, devem ser comprimidos.
Vamos executar uma execução a seco para ver o que o logrotate faria se fosse realmente executado agora. Use a opção -d
seguida do ficheiro de configuração (pode realmente executar logrotate omitindo esta opção):
# logrotate -d /etc/logrotate.d/apache2.conf
Os resultados são mostrados abaixo:
Em vez de comprimir os logs, poderíamos renomeá-los após a data em que foram rodados. Para tal, utilizaremos a directiva dateext
. Se o nosso formato de data for diferente do padrão yyyymmdd, podemos especificá-lo usando o formato de data.
Nota que podemos mesmo evitar que a rotação aconteça se o registo estiver vazio com notifempty. Além disso, vamos dizer ao logrotate para enviar o log rotativo ao administrador do sistema ([email protected] neste caso) para a sua referência (isto exigirá a configuração de um servidor de mail, que está fora do âmbito deste artigo).
Se quiser receber emails sobre logrotate, pode configurar o servidor de mail Postfix como mostrado aqui: Instalar o servidor de mail Postfix
Desta vez usaremos /etc/logrotate.d/squid.conf para rodar 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 protected]}
Como podemos ver na imagem abaixo, este log não precisava de ser rodado. Contudo, quando a condição de tamanho for cumprida (size=1M), o log rotacionado será renomeado access.log-25082020 (se o log foi rotacionado a 25 de Agosto de 2020) e o log principal (access.log) será recriado com as permissões de acesso definidas para 0644 e com a raiz como proprietário e proprietário do grupo.
Finalmente, quando o número de registos atingir finalmente 6, o registo mais antigo será enviado por correio para [email protected].
Agora vamos supor que quer executar um comando personalizado quando a rotação tiver lugar. Para o fazer, coloque a linha com tal comando entre as directivas postrotate e endcript.
Por exemplo, vamos supor que queremos enviar um e-mail para root quando qualquer um dos logs dentro de /var/log/myservice for rodado. Vamos adicionar as linhas a vermelho a /etc/logrotate.d/squid.conf:
last, mas não menos importante, é importante notar que as opções presentes em /etc/logrotate.d/*.conf
substituem as do ficheiro de configuração principal em caso de conflitos.
Logrotate e Cron
Por defeito, a instalação de logrotate cria um ficheiro crontab dentro de /etc/cron.daily chamado logrotate. Como é o caso dos outros ficheiros crontab dentro deste directório, será executado diariamente a partir das 6:25 da manhã se o anacron não estiver instalado.
Outra forma, a execução começará por volta das 7:35 da manhã. Para verificar, observe a linha contendo cron.daily em /etc/crontab ou /etc/anacrontab.
Sumário
Num sistema que gera vários logs, a administração de tais ficheiros pode ser grandemente simplificada usando o logrotate. Como explicamos neste artigo, ele irá rodar, comprimir, remover e enviar automaticamente os logs periodicamente ou quando o ficheiro atingir um determinado tamanho.
Apenas certifique-se de que está configurado para funcionar como um cron job e o logrotate irá tornar as coisas muito mais fáceis para si. Para mais detalhes, consulte a página man.