logrotate может перенести условия состязания?

У меня есть приложение PHP, которое может генерировать довольно большую информацию о журнале. Я хотел бы использовать logrotate для проверки эти журналы не выходят из-под контроля со временем.

Однако я обеспокоен условиями состязания. Могла там быть потеря сообщений журнала, если PHP посреди записи в журнал когда logrotate решает, что это должно повернуть тот журнал, как в последовательности событий ниже? В противном случае, почему?

  1. PHP открывает файл журнала для записи.
  2. PHP пишет строку.
  3. logrotate решает, что файл журнала должен быть повернут.
  4. PHP пишет другую строку.
  5. PHP закрывает ресурс файла.

Был бы с помощью 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);
1
задан 19 March 2015 в 13:49

1 ответ

Когда приложение открывает файл, продолжите писать в нем, даже если оно перемещено. Поэтому, если Вы хотите убедиться не потерять информацию, необходимо отправить сигнал в приложение, таким образом, это высвобождает средства.

Можно попробовать эту конфигурацию:

 /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.

Таким образом в Вашем случае:

  1. поверните файл
  2. удалите общий log.5, если существует
  3. создайте general.log с надлежащим атрибутом и owneship
  4. выполнения постповорачивают сценарий

Ваше приложение продолжит писать общий log.1 или до завершений файл или до postscript выполняется и nginx выполняют корректный перезапуск.

Если Ваше приложение всегда закрывает файл журнала через fclose($fp) или использование file_put_contents необходимо опустить nginx корректный перезапуск.

1
ответ дан 19 March 2015 в 13:49

Другие вопросы по тегам:

Похожие вопросы: