日志轮换故障排除

日志轮换故障排除

问题

我有几个相同的服务器,所有服务器都运行相同的logrotate配置,轮换自定义日志文件。在至少一台服务器上,我的日志没有正确轮换。

我已经断断续续地解决这个问题几个星期了,但没有成功。这是更多信息以及我迄今为止采取的步骤。任何帮助,将不胜感激。

我基本上已经没有办法解决这个问题了,并且希望有一些想法来尝试看看这里出了什么问题。

我尝试过的

(配置文件如下)

  1. 检查主logrotate文件的配置和权限。我觉得那里一切都很好。
  2. 将目标目录 的权限设置derp为 logrotate 所需的权限(该目录不能是全局可写的)AFAIK)。
  3. 强制logrotate运行以下命令:

    logrotate --force /etc/logrotate.d/derp
    

    此命令可以正确轮换日志,但第二天它们将不会运行。

  4. 手动将日期更改为过去的某个时间/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
    

    生活是美好的,不是吗?唯一的问题是,第二天,当它需要旋转时(即它总是有数据并且永远不为空),什么也没有发生。

  5. 我咨询过很多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 配置。

它很难看,但这是我修复这个错误的唯一方法。

相关内容