问题
我有几个相同的服务器,所有服务器都运行相同的logrotate
配置,轮换自定义日志文件。在至少一台服务器上,我的日志没有正确轮换。
我已经断断续续地解决这个问题几个星期了,但没有成功。这是更多信息以及我迄今为止采取的步骤。任何帮助,将不胜感激。
我基本上已经没有办法解决这个问题了,并且希望有一些想法来尝试看看这里出了什么问题。
我尝试过的
(配置文件如下)
- 检查主
logrotate
文件的配置和权限。我觉得那里一切都很好。 - 将目标目录 的权限设置
derp
为 logrotate 所需的权限(该目录不能是全局可写的)AFAIK)。 强制
logrotate
运行以下命令:logrotate --force /etc/logrotate.d/derp
此命令可以正确轮换日志,但第二天它们将不会运行。
手动将日期更改为过去的某个时间
/var/lib/logrotate/status
,然后查看日志是否在下次logrotate
启动时正确运行或使用:logrotate -vv /etc.logrotate.d/derp
这将轮换日志一次,但下次轮换日志时,它不会轮换。以下是成功手动旋转的输出:
rotating pattern: /derp/*.log after 1 days (14 rotations) empty log files are not rotated, old logs are removed considering log /derp/access.log log needs rotating considering log /derp/php_errors.log log does not need rotating rotating log /derp/access.log, log->rotateCount is 14 dateext suffix '-20150814' ... files getting renamed and moved ... running prerotate script renaming /derp/access.log to /derp/access.log.1 creating new /derp/access.log mode = 0774 uid = 0 gid = 4 running postrotate script
生活是美好的,不是吗?唯一的问题是,第二天,当它需要旋转时(即它总是有数据并且永远不为空),什么也没有发生。
我咨询过很多SEU的问题,其中有这个问题这在过去处理其他 logrotate 问题时很有帮助。
配置
系统运行的是最新的 Debian 7。生成日志文件的进程以 root 身份运行。生成日志文件的进程是一个php
应用程序,并产生多个子进程。
以下是相关配置,其中derp
是我的自定义日志文件的位置:
/etc/logrotate.d/derp
配置文件的权限:
-rw-r--r-- 1 root root 265 Jul 9 2014 derp
/derp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 774 root adm
sharedscripts
postrotate
nohup /derp/daemonrestart.sh > /dev/null 2>&1
endscript
prerotate
killall -9 php > /dev/null 2>&1
endscript
}
prerotate
和脚本postrotate
基本上启动进程(套接字服务器)或停止它并在所有其他服务器上正常工作。我很确定那里没有问题。
/var/lib/logrotate/status
(经过编辑以显示相关信息)
logrotate state -- version 2
"/var/log/kern.log" 2015-7-20
...
"/derp/php_errors.log" 2015-8-11
...
"/derp/access.log" 2015-8-14
...
/derp/
目标目录的权限:
drwxr-xr-x 2 root root 4096 Jun 18 10:05 derp
相关日志位于\derp\
:
-rwxrwxr-- 1 root adm 3755558 Aug 14 07:57 access.log
答案1
你写了:
使用以下命令强制 logrotate 运行:
logrotate --force /etc/logrotate.d/derp
.此命令可以正确轮换日志,但第二天它们将不会运行。
这里的问题是该daily
属性实际上意味着“24 小时”。因此,除非(可能在 中)cron
的条目距离您手动轮换日志文件的时间超过 24 小时,否则日志文件直到该日期后才会轮换。logrotate
/etc/cron.d/daily
在我的 Debian 系统上,条目/etc/cron.daily
每天在 06:25 运行,因此在正常工作日期间完成的任何手动日志轮换可能会阻止日志轮换发生,直到两天后。
答案2
好吧,我放弃了修复这个问题的尝试。克朗来救援。
sudo crontab -e
然后将以下行添加到超级用户的 crontab 中
# Logrotate they said...
3 6 * * * /usr/sbin/logrotate -f /etc/logrotate.d/derp &> /dev/null
该-f
标志强制 logrotate 旋转日志。位于的文件/etc/logrotate.d/derp
是我的应用程序的相应 logrotate 配置。
它很难看,但这是我修复这个错误的唯一方法。