logrotate误删全部Apache日志文件,配置排查求助
logrotate误删全部Apache日志文件,配置排查求助
哎,碰到这种情况真的太闹心了!本来好好设置了保留500天的每日日志,结果到点全没了还从头开始记录,我帮你梳理下配置里的疑点和排查方向:
先把你的问题背景和配置贴出来方便分析:
我原本设置logrotate保留最近500天的每日日志文件,但500天后所有日志都被删除了,日志记录又重新开始。服务器在同一时间前后重启过,但之前重启没出现过这种问题。另外
/etc/logrotate.d/httpd-prerotate不存在,所以prerotate阶段没有执行任何操作。
你的logrotate配置如下:
/var/log/apache2/*.log { daily missingok rotate 500 compress delaycompress notifempty create 640 root adm sharedscripts prerotate if [ -d /etc/logrotate.d/httpd-prerotate ]; then run-parts /etc/logrotate.d/httpd-prerotate fi endscript postrotate if pgrep -f ^/usr/sbin/apache2 > /dev/null; then invoke-rc.d apache2 reload 2>&1 | logger -t apache2.logrotate fi endscript }
几个可能的问题点和排查步骤:
- 先搞懂
rotate 500的实际含义:这个参数是指保留轮转后的归档文件数量,不是天数。因为你设置了daily每日轮转,正常来说500次轮转对应500天,但如果logrotate的状态记录出问题,这个计数就会乱。你可以先查看logrotate的状态文件(通常在/var/lib/logrotate/status或/var/lib/logrotate/logrotate.status),看看里面针对/var/log/apache2/*.log的记录,比如上次轮转时间、已轮转次数,是不是计数到500后出现了异常。 - 检查logrotate执行日志:去系统日志里搜logrotate的相关记录,比如执行
grep logrotate /var/log/syslog(不同系统可能是/var/log/messages),看看500天左右那次logrotate运行时有没有报错、异常删除的信息,说不定能找到直接原因。 - 排查是否有其他清理脚本干扰:看看服务器上有没有其他定时任务(比如cron)或者脚本在定期清理
/var/log/apache2/目录?比如有些系统会自带日志清理工具,或者运维自己加了脚本,这也可能导致日志被批量删除。 - 服务器重启的潜在影响:虽然之前重启没事,但这次重启会不会导致logrotate的状态文件损坏/丢失?如果状态文件没了,logrotate会误以为从来没轮转过,第一次执行时可能会把所有现有日志都归档,后续如果因为某些触发条件连续轮转,就可能把归档文件删超量?不过这个概率相对低,但可以排查下状态文件的完整性。
- postrotate脚本的匹配问题:你的postrotate里用
pgrep -f ^/usr/sbin/apache2判断Apache进程,如果Apache的启动命令不是以/usr/sbin/apache2精确开头(比如带了参数),这个匹配就会失败,导致不会reload Apache。这种情况下Apache可能还在写旧的归档文件,后续logrotate可能会因为文件变化再次轮转,但一般不会导致全部删除,不过也可以验证下这个匹配是否有效:直接执行pgrep -f ^/usr/sbin/apache2看看能不能输出进程ID。
备注:内容来源于stack exchange,提问作者otocan
相关产品推荐
相关产品推荐

