You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:13:09