Em servidores de aplicação, especialmente para casos onde ocorre um alto número de interações, o registro (log) dessas ações no sistema pode acabar gerando arquivos muito extensos e por consequência ocupar muito espaço no disco. O LogRotate é um utilitário de sistema que gerencia a rotatividade (de forma a manter somente registros de um determinado período mais recente) e compactação automáticas de arquivos de log. O Logrotate é instalado por padrão no Ubuntu (e outras distros principais do Linux) e é configurado para lidar com as necessidades de rotatividade de log de todos os pacotes instalados, incluindo rsyslog, o processador de log padrão do sistema. Neste post, exploraremos a configuração padrão do Logrotate e, em seguida, definiremos a rotatividade para uma aplicação hipotética.
Confirmando sua versão do LogRotate
Antes de tudo, certifique-se de que o LogRotate está instalado em seu servidor, verificando sua versão:
1 2 |
logrotate --version > logrotate 3.8.7 |
Se não estiver instalado, o comando irá gerar um erro. Nesse caso, instale usando o gerenciador de pacotes da sua distro.
Explorando a configuração do LogRotate
Em geral, os arquivos de configuração podem estar localizados em algum destes destinos nos servidores Ubuntu:
- /etc/logrotate.conf : este arquivo contém algumas configurações padrão e define a rotatividade para alguns logs que não pertencem a nenhum pacote de sistema. Também possui uma declaração de include para importar qualquer arquivo de configuração localizado no diretório /etc/logrotate.d/ .
- /etc/logrotate.d/ : este é o diretório onde estarão localizadas quaisquer configurações de pacote que necessitem ser rotacionados. Por padrão, você já deve ter arquivos para utilitários comuns do sistema, como apt e dpkg , por exemplo.
Por padrão, o arquivo logrotate.conf define uma rotatividade semanal do log, para arquivos pertencentes ao usuário root e ao grupo syslog ( su root syslog ) com 4 arquivos de log sendo mantidos ( rotate 4 ), e novos arquivos vazios de log sendo criados assim que o atual é rotacionado ( create ).
Vamos dar uma olhada, por exemplo, no arquivo de configuração do utilitário apt :
1 |
cat /etc/logrotate.d/apt |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/var/log/apt/term.log { rotate 12 monthly compress missingok notifempty } /var/log/apt/history.log { rotate 12 monthly compress missingok notifempty } |
Este arquivo contém blocos de configuração para dois logs diferentes: term.log e history.log . Ambos possuem as mesms diretivas. Quaisquer configurações que não sejam definidas no bloco herdarão as configurações padrão ou as que estiverem definidas em /etc/logrotate.conf . As diretivas mostradas acima são:
- rotate 12: mantém 12 arquivos de log antigos.
- monthly: rotaciona uma vez por mês.
- compress: comprime os arquivos rotacionados. Utiliza o gzip e por padrão os arquivos possuem a extensão .gz .
- missingok: não escrever uma mensagem de erro se o arquivo de log não for encontrado.
- notifempty: não rotacionar o arquivo de log se estiver vazio.
Existem inúmeras opções de configurações disponíveis. Você pode listá-las através do manual man logrotate .
Definindo uma configuração de exemplo
Para gerenciar arquivos de log para aplicações que não estão inclusa nos exemplos padrão, temos duas opções:
To manage log files for applications outside of the pre-packaged and pre-configured system services, we have two options:
- Criar um novo arquivo de configuração do LogRotate em /etc/logrotate.d/ . A rotina será executada diariamente como o usuário root , juntamente com as demais rotinas do LogRotate.
- Criar um novo arquivo de configuração e executá-lo fora da configuração padrão do LogRotate. Isto só é realmente necessário se por algum motivo você precisar executar o LogRotate com um usuário não-root, ou se desejar executar a rotina mais frequentemente (de hora em hora, por exemplo).
Vamos explorar essas duas possibilidades com alguns exemplos.
Adicionando uma configuração ao /etc/logrotate.d/
Se nós quisermos configurar a rotação para um servidor web fictício que escreve nos arquivos access.log e error.log , no diretório /var/log/exemplo-app , por exemplo. Ele é executado como usuário e grupo www-data . Para adicionar uma nova configuração, criamos um novo arquivo no diretório:
1 |
sudo nano /etc/logrotate.d/example-app |
Um exemplo de arquivo de configuração para gerenciar esses logs:
1 2 3 4 5 6 7 8 9 10 11 12 |
/var/log/example-app/*.log { daily missingok rotate 14 compress notifempty create 0640 www-data www-data sharedscripts postrotate systemctl reload example-app endscript } |
Algumas diretivas novas nesse arquivo são:
- create 0640 www-data www-data : cria um novo arquivo de log vazio após a rotação, com as permissões especificadas, ( 0640 ), usuário root ( www-data ) e grupo (também www-data ).
- sharedscripts : essa flag indica que quaisquer scripts adicionados à configuração são executados somente uma vez por rotina, em vez de reexecutá-los para cada arquivo rotacionado. Uma vez que essa configuração se aplica a dois arquivos no diretório, o script especificado em postrotate executaria duas vezes sem essa diretiva.
- postrotate até endscript: esse bloco contém um script que executa após a rotação do log. Nesse caso nós estamos recarregando nossa aplicação. Isso pode ser necessário para que o sistema troque para o ovo arquivo de log criado. Note que o trecho é executado antes de comprimir os arquivos de log.
Após personalizar a sua configuração conforme sua necessidade e salvar ela no diretório, você pode testá-la pelo comando de debug :
1 |
sudo logrotate /etc/logrotate.conf --debug |
A saída exibirá quais os arquivos gerenciados pelo LogRotate e quais as diretivas indicadas. Se tudo correr bem, a rotina será executada diariamente e incluirá sua nova configuração.
Criando uma configuração independente
Neste exemplo nós temos um app executando com nosso usuário ronan, gerando logs que são armazenados em /home/ronan/logs . Nós queremos rotacionar esses logs de hora em hora, então precisamos configurá-los fora do diretório padrão. Primeiro, criamos nosso arquivo de configuração:
1 |
nano /home/ronan/logrotate.conf |
Então definimos as diretivas abaixo:
1 2 3 4 5 6 7 |
/home/ronan/logs/*.log { hourly missingok rotate 24 compress create } |
Salve o arquivo e feche. Você precisará personalizar a configuração para atender à sua aplicação, mas esse é um bom ponto de partida.
Para testar se funciona, podemos criar um arquivo de log:
1 2 3 |
cd ~ mkdir logs touch logs/access.log |
Agora que temos um arquivo em branco no lugar certo, vamos executar o comando logrotate .
Uma vez que os logs pertencem ao usuário ronan nós não temos que usar sudo , mas nós precisamos criar um arquivo de estado. Esse arquivo armazena o que o logrotate leu e fez na última vez em que foi executado, de forma a saber de onde partir na execução seguinte. Isso é gerenciado por padrão no Ubuntu pelo arquivo /var/lib/logrotate/status , mas agora nós precisamos fazê-lo manualmente:
1 |
logrotate /home/ronan/logrotate.conf --state /home/ronan/logrotate-state --verbose |
1 2 3 4 5 6 7 8 |
reading config file /home/ronan/logrotate.conf Handling 1 logs rotating pattern: /home/ronan/logs/*.log hourly (24 rotations) empty log files are rotated, old logs are removed considering log /home/ronan/logs/access.log log does not need rotating |
O parâmetro --verbose irá imprimir de forma detalhada as ações do logrotate . Neste caso, parece que ele não fez nada. É a primeira vez em qeu ele lê o arquivo, então até onde sabemos, o arquivo vazio não deveria ser rotacionado. Se verificarmos o arquivo de estado, entretanto:
1 |
cat /home/ronan/logrotate-state |
1 2 |
logrotate state -- version 2 "/home/ronan/logs/access.log" 2017-11-7-19:0:0 |
Por fim, precisamos definir uma rotina no cron job para executar o LogRotate a cada hora:
1 |
crontab -e |
Esse comando abrirá um arquivo de texto com as diretivas atuais. Abaixo de todas elas, insira a que corresponde ao LogRotate:
1 |
14 * * * * /usr/sbin/logrotate /home/ronan/logrotate.conf --state /home/ronan/logrotate-state |
Essa rotina será executada todo 14º minuto de cada hora, cada dia, executando basicamente o comando que vimos anteriormente. Salve o arquivo e saia, isso atualizará o crontab .
Esses procedimentos são suficientes para ter o LogRotate operando em seu servidor. Quaisquer dúvidas ou sugestões, utilize a área de comentários ou entre em contato!
Nenhum Comentário