Erro com gunzip durante logrotate

6

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

    
por Gary Olsson 15.01.2016 / 11:46

2 respostas

3

De acordo com seu strace, seu problema não é realmente gzip.

Eis porque o gzip falha.

14972 write(1, "<Here is the content of my prod.log file>"..., 32768) = -1 EPIPE (Broken pipe)

O processo está gravando no stdout, mas a saída real disso é a entrada para o comando mail. Se nós verificarmos isso:

14973 execve("/usr/bin/mail", ["/usr/bin/mail", "-s", "/var/www/symfony/app/logs/prod.log", "[email protected]"], ["SHELL=/bin/bash", "TERM=xterm", "USER=root", "LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41"..., "SUDO_USER=none", "SUDO_UID=1000", "USERNAME=root", "MAIL=/var/mail/root", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "PWD=/home/none", "LANG=en_GB.UTF-8", "SHLVL=1", "SUDO_COMMAND=/bin/bash", "HOME=/root", "LANGUAGE=en_GB:en", "LOGNAME=root", "SUDO_GID=1000", "_=/usr/bin/strace"] <unfinished ...>
14973 <... execve resumed> )            = -1 ENOENT (No such file or directory)

Quando você tenta executar o comando mail, ele falha porque /usr/bin/mail não existe. O programa sai, a stdout de gzip retorna SIGPIPE quando a outra extremidade do pipe desapareceu. Assim gzip sai com um 1.

O que você precisa fazer é instalar um comando mail . Isso é provavelmente bsd-mailx em sistemas debianesque ou mailx em sistemas baseados em Redhat.

    
por 19.01.2016 / 20:31
1

Use um script prerotate ou postrotate para enviar os registros por conta própria. Isso lhe dá a flexibilidade de enviar os logs como um anexo compactado, se preferir, ou descompactá-los.

Há um número de opções para enviar anexos do CLI .

    
por 19.01.2016 / 19:24