Estou usando o logrotate para girar meus logs do Symfony2 em meu servidor da Web.
Tudo funciona bem, mas eu queria que os logs antigos fossem enviados para mim por e-mails.
Então, eu adicionei alguma linha no meu arquivo conf logrotate como você pode ver abaixo
Configuração de logrotate
/var/www/symfony/app/logs/prod.log {
daily
missingok
rotate 5
compress
notifempty
mail [email protected]
su www-data www-data
}
Agora recebo e-mails, mas o conteúdo não é exatamente o que eu esperava.
E-mail recebido
/etc/cron.daily/logrotate:
error: mail command failed for /var/www/symfony/app/logs/prod.log.6.gz
error: uncompress command failed mailing /var/www/symfony/app/logs/prod.log.6.gz
run-parts: /etc/cron.daily/logrotate exited with return code 1
Eu fiz muitas pesquisas sobre esse erro, mas não encontrei nada útil.
Eu lancei uma estratégia na esperança de obter algumas dicas sobre o problema, mas não funcionou como esperado.
Comando Strace
strace -f -o ./strace.txt logrotate -d /etc/logrotate.d/symfony2
O arquivo gerado é bem grande, mas acho que a parte reveladora é a seguinte
Saída de Strace
6842 execve("/usr/bin/mail", ["/usr/bin/mail", "-s", "/var/www/symfony/app/logs/prod."..., "[email protected]"], [/* 18 vars /]
6841 <... setgid resumed> ) = 0
6842 <... execve resumed> ) = -1 ENOENT (No such file or directory)
6841 setuid(0) = 0
6841 execve("/bin/gunzip", ["/bin/gunzip"], [/ 18 vars */]
6842 exit_group(1) = ?
6841 <... execve resumed> ) = 0
6842 +++ exited with 1 +++
6841 brk(0
6840 <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 6842
6841 <... brk resumed> ) = 0x85f010
6840 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=6842, si_uid=0, si_status=1, si_utime=0, si_stime=0} ---
6840 write(2, "error: ", 7
6841 access("/etc/ld.so.nohwcap", F_OK
6840 <... write resumed> ) = 7
6841 <... access resumed> ) = -1 ENOENT (No such file or directory)
6840 write(2, "mail command failed for /var/www"..., 65
Como você pode ver, o comando gunzip sai com o código de erro 1 e alguns pontos de interrogação muito explícitos (?) para me ajudar a entender melhor o que está acontecendo. O único erro que estou recebendo é "Nenhum tal arquivo ou diretório" que eu acho muito estranho porque o logrotate deve manipular a rotação de arquivos antes de enviar e-mails.
Minha pergunta, como resolver esse problema com gunzip / logrotate para receber o arquivo de log rotacionado por e-mail antes que ele seja excluído?
Aqui estão algumas informações no meu servidor que podem ser relevantes para o problema
root@someServer:/home/someUser# cat /etc/debian_version
8.1
root@someServer:/home/someUser# logrotate --version
logrotate 3.8.7
root@someServer:/home/someUser# gzip --version
gzip 1.6
Além disso, meus arquivos de registros são bem pequenos (~ 300-400 bytes) e se eu usar o gunzip manualmente, ele funciona muito bem.
Editar - adicionando saída logrotate
Handling 1 logs
rotating pattern: /var/www/symfony/app/logs/prod.log forced from command line (5 rotations)
empty log files are not rotated, old logs mailed to [email protected]
switching euid to 1000 and egid to 33
considering log /var/www/symfony/app/logs/prod.log
log needs rotating
rotating log /var/www/symfony/app/logs/prod.log, log->rotateCount is 5
dateext suffix '-2016011811'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/www/symfony/app/logs/prod.log.5.gz to /var/www/symfony/app/logs/prod.log.6.gz (rotatecount 5, logstart 1, i 5),
renaming /var/www/symfony/app/logs/prod.log.4.gz to /var/www/symfony/app/logs/prod.log.5.gz (rotatecount 5, logstart 1, i 4),
renaming /var/www/symfony/app/logs/prod.log.3.gz to /var/www/symfony/app/logs/prod.log.4.gz (rotatecount 5, logstart 1, i 3),
renaming /var/www/symfony/app/logs/prod.log.2.gz to /var/www/symfony/app/logs/prod.log.3.gz (rotatecount 5, logstart 1, i 2),
renaming /var/www/symfony/app/logs/prod.log.1.gz to /var/www/symfony/app/logs/prod.log.2.gz (rotatecount 5, logstart 1, i 1),
renaming /var/www/symfony/app/logs/prod.log.0.gz to /var/www/symfony/app/logs/prod.log.1.gz (rotatecount 5, logstart 1, i 0),
old log /var/www/symfony/app/logs/prod.log.0.gz does not exist
renaming /var/www/symfony/app/logs/prod.log to /var/www/symfony/app/logs/prod.log.1
compressing log with: /bin/gzip
switching uid to 1000 and gid to 33
switching uid to 1000 and gid to 33
switching euid to 0 and egid to 0
error: mail command failed for /var/www/symfony/app/logs/prod.log.6.gz
error: uncompress command failed mailing /var/www/symfony/app/logs/prod.log.6.gz
switching euid to 0 and egid to 0
Traçado completo abaixo:
strace -vf -s 128 -e verbose=all -o ./strace.txt logrotate -d /etc/logrotate.d/symfony2
link