在logrotate期间出现gunzip错误

我正在使用logrotate来旋转我的Web服务器上的Symfony2日志。
一切工作正常,但我想通过电子邮件发送给我的旧日志。
所以,我在logrotate conf文件中添加了一些行,如下所示

Logrotateconfiguration

/var/www/symfony/app/logs/prod.log { daily missingok rotate 5 compress notifempty mail [email protected] su www-data www-data } 

现在我收到了电子邮件,但内容并不是我所期望的。

收到电子邮件

/etc/cron.daily/logrotate:
错误:/var/www/symfony/app/logs/prod.log.6.gz邮件命令失败
错误:解压缩命令失败邮件/var/www/symfony/app/logs/prod.log.6.gz
运行部分:/etc/cron.daily/logrotate退出,返回代码1

我做了很多研究这个错误,但我没有发现任何有用的东西。 我已经发起了一个讨论,希望能够对这个问题有所了解,但是并没有如预期的那样奏效。

Strace命令

 strace -f -o ./strace.txt logrotate -d /etc/logrotate.d/symfony2 

生成的文件是相当大的,但我认为相关部分是以下

Strace输出

6842 execve(“/ usr / bin / mail”,[“/ usr / bin / mail”,“-s”,“/ var / www / symfony / app / logs / prod。”,“myemail @ example .com“],[/ * 18 vars /]
6841 <… setgid恢复>)= 0
6842 <… execve恢复>)= -1 ENOENT(没有这样的文件或目录)
6841 setuid(0)= 0
6841 execve(“/ bin / gunzip”,[“/ bin / gunzip”],[/ 18 vars * /]
6842 exit_group(1)=?
6841 <… execve恢复>)= 0
6842 +++退出1 +++
0
6840 <… wait4恢复> [{WIFEXITED(s)&& WEXITSTATUS(s)== 1}],0,NULL)= 6842
6841 <… brk恢复>)= 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写(2,“错误:”,7
6841访问(“/ etc / ld.so.nohwcap”,F_OK
6840 <…写恢复>)= 7
6841 <…访问恢复>)= -1 ENOENT(没有这样的文件或目录)
6840写(2,“邮件命令失败/ var / www”…,65

正如你所看到的,gunzip命令退出错误代码1和一些非常明确的问号(?),以帮助我更好地理解发生了什么。 我得到的唯一的错误是“没有这样的文件或目录”,我觉得很奇怪,因为logrotate应该在发送电子邮件之前处理文件轮播。

我的问题,如何解决这个问题与gunzip / logrotate为了通过电子邮件接收旋转的日志文件才被删除?

以下是我的服务器上可能与问题相关的一些信息

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

另外,我的日志文件很小(〜300-400字节),如果我手动使用gunzip,它工作得很好。


编辑 – 添加logrotate输出

处理1个日志

旋转模式:/var/www/symfony/app/logs/prod.log强制从命令行(5转)
空的日志文件不旋转,旧的日志邮寄到[email protected]
将euid切换到1000,egid切换到33
考虑日志/var/www/symfony/app/logs/prod.log
日志需要旋转
旋转日志/var/www/symfony/app/logs/prod.log,log-> rotateCount是5
date后缀'-2016011811'
glob pattern' – [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [ 0-9]”
将/var/www/symfony/app/logs/prod.log.5.gz重命名为/var/www/symfony/app/logs/prod.log.6.gz(rotatecount 5,logstart 1,i 5),
将/var/www/symfony/app/logs/prod.log.4.gz重命名为/var/www/symfony/app/logs/prod.log.5.gz(rotatecount 5,logstart 1,i 4),
将/var/www/symfony/app/logs/prod.log.3.gz重命名为/var/www/symfony/app/logs/prod.log.4.gz(rotatecount 5,logstart 1,i 3),
将/var/www/symfony/app/logs/prod.log.2.gz重命名为/var/www/symfony/app/logs/prod.log.3.gz(rotatecount 5,logstart 1,i 2),
将/var/www/symfony/app/logs/prod.log.1.gz重命名为/var/www/symfony/app/logs/prod.log.2.gz(rotatecount 5,logstart 1,i 1),
将/var/www/symfony/app/logs/prod.log.0.gz重命名为/var/www/symfony/app/logs/prod.log.1.gz(rotatecount 5,logstart 1,i 0),
旧日志/var/www/symfony/app/logs/prod.log.0.gz不存在
将/var/www/symfony/app/logs/prod.log重命名为/var/www/symfony/app/logs/prod.log.1
使用/ bin / gzip压缩日志
将uid切换到1000,gid切换到33
将uid切换到1000,gid切换到33
将euid切换为0,egid切换为0
错误:/var/www/symfony/app/logs/prod.log.6.gz邮件命令失败
错误:解压缩命令失败邮件/var/www/symfony/app/logs/prod.log.6.gz
将euid切换为0,egid切换为0

下面是全部的信息:

  strace -vf -s 128 -e verbose=all -o ./strace.txt logrotate -d /etc/logrotate.d/symfony2 

http://pastebin.com/C0uj0419

根据你的strace,你的问题实际上不是gzip。

这是gzip失败的原因。

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

该过程正在写入标准输出,但实际的输出却是邮件命令的input。 如果我们检查这个:

 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) 

当您尝试执行邮件命令时,由于/usr/bin/mail不存在而失败。 程序退出时, gzipstdout会返回SIGPIPE因为pipe道的另一端已经消失。 因此gzip退出1。

你需要做的是安装mail命令。 这可能是debsnesque系统上的bsd-mailx或基于Redhat的系统上的mailx

使用prerotatepostrotate脚本自己发送日志。 如果您愿意,可以灵活地将日志作为压缩附件发送,或者将其解压缩。

从CLI发送附件有很多选项 。