У меня есть приложение PHP, которое может генерировать довольно много информации журнала. Я хотел бы использовать logrotate, чтобы убедиться, что эти журналы не выходят из-под контроля.
Однако меня беспокоят условия гонки. Может ли быть потеря сообщений журнала, если PHP находится в середине записи в журнал, когда logrotate определяет, что ему необходимо повернуть этот журнал, как в последовательности событий ниже? Если нет, то почему?
PHP открывает файл журнала для записи. PHP пишет строку. logrotate решает, что файл журнала должен быть повернут. PHP пишет другую строку. PHP закрывает файловый ресурс.Использует ли PHP 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);