После ротации программа должна писать в новый файл. Получится ли это, зависит от того, как она открывает лог.
Программа, которая открывает лог на каждую запись — как echo … >> app.log, — после ротации пишет в новый app.log. Но писать она будет с правами своего пользователя: если строка create отдала новый файл root, программа получит Permission denied.
Программа, которая держит лог открытым, пишет через файловый дескриптор — в тот же файл и после переименования, то есть в app.log.1. Её просят открыть лог заново командой в блоке postrotate правила: у nginx в /etc/logrotate.d/nginx это invoke-rc.d nginx rotate. Так же держит файл tail -f: во время ротации он остаётся на переименованном файле, а tail -F следит за именем и переходит на новый. Директива copytruncate вместо переименования копирует лог и обнуляет его, но строки, записанные между копированием и обнулением, теряются.
Служба держит свой лог открытым всё время работы. Правило переименовало app.log в app.log.1 и создало новый app.log, а блока postrotate в нём нет. Куда пойдут следующие записи службы?
-
Служба пишет через открытый дескриптор, а он указывает на старый файл и после переименования. Новый
app.logона откроет, только если её попросят — командой вpostrotate. -
Переименование файл не закрывает и не удаляет: запись через дескриптор продолжается без ошибок, просто в
app.log.1.
Дескриптор связан с самим файлом, а не с его именем, поэтому служба пишет в переименованный app.log.1. Переоткрыть лог её просят командой в postrotate, как в правиле nginx.
Главное в шаге
- Программа, открывающая лог на каждую запись, после ротации пишет в новый файл — с правами своего пользователя.
-
Программа с открытым файлом пишет в переименованный, её просят переоткрыть лог в
postrotate. -
copytruncateможет потерять строки, записанные во время ротации.