Ниже представлена моя конфигурация ротации журналов для / 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 создал сообщения.1, где мои предыдущие журналы копируются, а rsyslog все еще записывает в сообщения.1 (возможно, из-за задержка сжатия). Теперь файл сообщений создается заново, когда произошла ротация журнала, он имеет нулевой размер.
Поскольку для моего приложения включено большое количество журналов, а rsyslog все еще записывает в messages.1, он стал больше, чем 3G, а файл сообщений был нулевым.
Что-то не так с моими конфигурациями, или мне нужно включить / отключить определенные функции logrotate, чтобы никогда не попасть в такой сценарий?
# logrotate --version
logrotate 3.8.7
Попробуйте вручную, если такая командная строка действительно перезагружает rsyslog. Протестируйте его, переименовав сообщения в messages.x и коснувшись сообщений плюс chmod / chown с теми же разрешениями, что и исходные сообщения, а затем запустите эту команду kill, чтобы посмотреть, действительно ли rsyslog начинает использовать новый файл. Если нет, возможно, что-то не так с этой командой. Правильный ли pid в таком pidfile? Присутствует ли вообще 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
...