以下是我的 /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
...