Как правильно организовать logrotate в своем сервисе?
С Apache/MySQL/Nginx и пр. все понятно.
Есть собственный сервис (С++ приложение), который пишет лог в файл.
Как правильно подключить к нему logrotate?
Как я понимаю, нужно файл закрыть (т.е. обработать какой-то сигнал?), потом logrotate его обработает и затем открыть (опять какой-то сигнал?).
Есть у кого простейший пример, можно схематический.
copytruncate
Truncate the original log file to zero size in place after cre‐
ating a copy, instead of moving the old log file and optionally
creating a new one. It can be used when some program cannot be
told to close its logfile and thus might continue writing
(appending) to the previous log file forever. Note that there
is a very small time slice between copying the file and truncat‐
ing it, so some logging data might be lost. When this option is
used, the create option will have no effect, as the old log file
stays in place.
Дык, что не понятно: файл открыт на запись, записано куча данных, текущий указатель стоит на оределенной позиции файла. В это время кто-то снаружи делает truncate. Что будет с программой, если она, не переоткрывая файл, попытается записать что-то?
Linux позволяет переименовать файл, при этом сервис продолжит писать в него. Единственное что нужно реализовать, так это переоткрытие файла, logrotate переименовывает, а затем посылает сигнал приложению, к примеру SIGUSR1, по нему просто переоткрываете файл лога и продолжаете писать. Ничего нигде не сломается.