Como fazer rotação dos logs do Apache por hora?

Então você tem um servidor com Apache instalado gerando centenas de MB para lotar seu disco, certo? Vamos lá…

Depois de muita pesquisa, não consegui usar o logrotate para fazer a rotação dos logs de hora em hora. Desconfio que não faça mesmo a rotação de arquivos de log por hora, então implementei outra solução que vou compartilhar aqui com vocês

Criei um script que é executado de hora em hora pelo cron. Para isto basta criá-lo em /etc/cron.hourly.

[ricardo@martins]# vim /etc/cron.hourly/httpd_log_archive

Abaixo o conteúdo do script:

#!/bin/bash
cd /var/log/httpd
mv *.log* ./archive/
touch access.log
touch error.log
touch ssl_access.log
touch ssl_error.log
touch ssl_request.log
service httpd reload
cd /var/log/httpd/archive
mv -f access.log access.log.`date +%Y-%m-%d_%H`
mv -f error.log error.log.`date +%Y-%m-%d_%H`
mv -f ssl_access.log ssl_access.log.`date +%Y-%m-%d_%H`
mv -f ssl_error.log ssl_error.log.`date +%Y-%m-%d_%H`
mv -f ssl_request.log ssl_request.log.`date +%Y-%m-%d_%H`
gzip *.`date +%Y-%m-%d_%H`

for lista in `find /var/log/httpd/archive -mtime +30`; do
rm -rf ${lista}
done

Em seguida, permissões de execução nele!

[ricardo@martins]# chmod a+x /etc/cron.hourly/httpd_log_archive

E por fim, criamos o diretório de trabalho do script, onde ele armazenará os arquivos para rodar os comandos do script:

[ricardo@martins]# mkdir /var/log/httpd/archive

Agora vamos explicar o funcionamento do script. Cada número representa a linha do script:

1. Primeira linha de todo script shell, indicando que deve ser executado pelo bash
2. Vamos até o diretório dos arquivos de log
3. Movemos todos os arquivos *.log* para o diretório /var/log/archive
4. Recriamos o arquivo access.log
5. Recriamos o arquivo error.log
6. Recriamos o arquivo ssl_access.log
7. Recriamos o arquivo ssl_error.log
8. Recriamos o arquivo ssl_request.log
9. Recarregamos as configurações do Apache para forçar a começar a escrever o log nestes novos arquivos
10. Vamos até o diretório de trabalho do script
11. Renomeando o arquivo access.log para inserir a data e hora de execução do script. No caso, ficaria access.log.2012-12-12_09, informando que foi executado No ano de 2012, mês 12, dia 12, às 09 horas da manhã.
12. Renomeando o arquivo error.log …
13. Renomeando o arquivo ssl_access …
14. Renomeando o arquivo ssl_error.log …
15. Renomeando o arquivo ssl_request.log …
16. Compactando com o gzip todos os arquivos acrescentando no final do nome a data e hora de execução do script. Por exemplo, ficaria assim: access.log.2012-12-12_09.gz
17. Criando uma lista dos arquivos existente neste diretório com mais de 30 dias e armazenando na variável “lista”
18. Apaga todos os arquivos contidos na variável “lista”.
19. Sair do For e finaliza o script.

Pronto!