У меня есть приложение PHP, которое может генерировать довольно большую информацию о журнале. Я хотел бы использовать logrotate
для проверки эти журналы не выходят из-под контроля со временем.
Однако я обеспокоен условиями состязания. Могла там быть потеря сообщений журнала, если PHP посреди записи в журнал когда logrotate
решает, что это должно повернуть тот журнал, как в последовательности событий ниже? В противном случае, почему?
logrotate
решает, что файл журнала должен быть повернут.Был бы с помощью PHP's file_put_contents
, например, имейте какое-либо значение? Что относительно, в более общем плане, вывод, который передается по каналу к файлу журнала?
Специфические особенности среды:
Я использую php5-fpm
(Version: 5.5.9+dfsg-1ubuntu4.6
) позади nginx сервера на другой машине.
Моя предложенная конфигурация logrotate (я ничего еще не настроил), было бы что-то вроде этого (в /etc/logrotate.d/my-app
):
/var/my-app-data/logs/*.log {
missingok
notifempty
weekly
size 20M
rotate 4
}
Несколько примеров моего PHP, регистрирующего код:
$res = file_put_contents('/var/my-app-data/logs/general.log', date('[d/m/Y H:i:s]') . ' Something noteworthy has happened!' . "\n", FILE_APPEND);
Возможно, что мы можем хотеть использовать что-то как код ниже в будущем:
$fp = fopen('/var/my-app-data/logs/general.log', 'a');
fwrite($fp, date('[d/m/Y H:i:s]') . ' Starting process...' . "\n");
// ...
fwrite($fp, date('[d/m/Y H:i:s]') . ' Something happened!' . "\n");
// ...
fwrite($fp, date('[d/m/Y H:i:s]') . ' Something happened!' . "\n");
// ...
fwrite($fp, date('[d/m/Y H:i:s]') . ' End of process.' . "\n");
fclose($fp);
Когда приложение открывает файл, продолжите писать в нем, даже если оно перемещено. Поэтому, если Вы хотите убедиться не потерять информацию, необходимо отправить сигнал в приложение, таким образом, это высвобождает средства.
Можно попробовать эту конфигурацию:
/var/my-app-data/logs/general.log {
missingok
notifempty
size 20M
rotate 4
create mode owner group
sharedscripts
postrotate
nginx command to do graceful restart
endscript
}
Это general.log
файл повернут каждый раз, когда это растет 20M
в размере, после прохождения через 4
вращения, файл удален.
sharedscripts
средства, что postrotate
скрипт будет только запущен однажды, не однажды для каждого журнала, который повернут.
Согласно logrotate руководству:
create mode owner group
Immediately after rotation (before the postrotate script is run)
the log file is created (with the same name as the log file just
rotated). mode specifies the mode for the log file in octal
(the same as chmod(2)), owner specifies the user name who will
own the log file, and group specifies the group the log file
will belong to.
Таким образом в Вашем случае:
Ваше приложение продолжит писать общий log.1 или до завершений файл или до postscript
выполняется и nginx выполняют корректный перезапуск.
Если Ваше приложение всегда закрывает файл журнала через fclose($fp)
или использование file_put_contents
необходимо опустить nginx
корректный перезапуск.