logrotate 似乎没有按预期工作

logrotate 似乎没有按预期工作

以下是我的 /var/log/messages 日志轮换配置。

/var/log/messages
{
    rotate 4
    size 100M
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
    ifconfig eth0 | grep 'Device not found' &>/dev/null
    if [ $? != 0 ]; then
      kill -HUP $(cat /var/run/rsyslog.pid) > /dev/null
    else
      kill -HUP $(cat /var/run/rsyslog_1.pid) > /dev/null
    fi
    endscript
}

我最终遇到了这样一种情况:logrotate 创建了 messages.1,其中复制了我之前的日志,而 rsyslog 仍然在写入 messages.1(可能是因为延时压缩)。现在,当日志轮换发生时,将新建一个消息文件,其大小为零。

由于我为我的应用程序启用了大量日志记录,并且 rsyslog 仍然在写入 messages.1,因此它变得超过 3G,而 messages 文件为零。

我的配置有什么问题吗?或者我是否需要启用/禁用某些 logrotate 功能以避免出现这种情况?

# logrotate --version 
logrotate 3.8.7

答案1

手动尝试您使用的命令行是否确实重新加载了 rsyslog。通过将消息重命名为 messages.x 并触摸消息加上 chmod/chown 将其设置为与原始消息相同的权限来测试它,然后运行此 kill 命令,看看 rsyslog 是否真的开始使用新文件。如果没有,那么该命令可能存在问题。此类 pidfile 中的 pid 是否正确?pidfile 是否存在?

无论如何,还有更多尝试,Debian 使用这些例如:

systemctl kill -s HUP rsyslog.service
invoke-rc.d rsyslog rotate

当然,要调试 logrotate,

logrotate -vf /etc/logrotate.conf

这可能表明 logrotate 配置存在一些问题。

最后,进行一些简单的调试,看看执行了什么:

...
postrotate
echo "before ifconfig" >> /tmp/logrotate.debug
ifconfig eth0 | grep 'Device not found' &>/dev/null
echo "after ifconfig" >> /tmp/logrotate.debug
if [ $? != 0 ]; then
  echo "inside if" >> /tmp/logrotate.debug
  kill -HUP $(cat /var/run/rsyslog.pid) > /dev/null
else
  echo "inside else" >> /tmp/logrotate.debug
  kill -HUP $(cat /var/run/rsyslog_1.pid) > /dev/null
fi
echo "at endscript" >> /tmp/logrotate.debug
endscript
...

相关内容