Назад | Перейти на главную страницу

Вращение журнала, управляемое свободным пространством в Linux?

Кто-то просто спросил меня, «как долго мы должны хранить журналы для нашего приложения», и я ответил «до тех пор, пока диск не заполнится», поскольку нет никаких причин выбрасывать их, кроме как исчерпать свободное место.

Однако стандартный логротейт хочет, чтобы мы указали определенный период + количество оборотов. Есть ли что-то подобное, что позволило бы нам сказать «чередуйте ежедневно и сохраняйте столько истории, сколько хотите, пока не останется только 5% свободного места»?

Платформа - Redhat Linux.

Возможно, вы можете использовать директивы firstaction или lastaction для вызова сценария оболочки, который проверяет наличие свободного места на диске, а затем запускает удаление самых старых файлов.

   firstaction/endscript
          The lines between firstaction and endscript (both of which must appear on lines by themselves) are
          executed (using /bin/sh) once before all log files that match the wildcarded pattern are  rotated,
          before  prerotate  script  is  run  and  only if at least one log will actually be rotated.  These
          directives may only appear inside a log file definition. Whole pattern is passed to the script  as
          first  argument.  If  the script exits with error, no further processing is done. See also lastac-
          tion.

Обновить:

Вот сообщение Stackoverflow о типе скрипта, который вы можете запустить:

https://stackoverflow.com/questions/7523059/remove-oldest-file-in-repository

Сам logrotate не имеет такой опции. Вы можете добавить скрипт cron, который находит самый старый журнал и удаляет его всякий раз, когда свободное пространство оказывается ниже ваших критериев. Вы также можете выполнить другую проверку. Однако постоянно переполнять диск - не лучшая идея, поскольку система не сможет создавать большие временные файлы и может вызвать сбои приложений.

Я просто хотел указать, что есть случаи, когда вы не хотите, чтобы ваши журналы заполняли все доступное дисковое пространство. Я имел дело с несколькими хостами с каталогами thin provisioned / var, и сохранение журналов определенного размера было критически важным. Мы использовали работу с друзьями в сочетании с логроратом, чтобы уменьшить размер. Что-то подобное можно использовать в вашей среде, хотя центральный сервер журналов, такой как splunk или syslog-ng, вероятно, будет лучшим вариантом.

Как предложил @cjc, вы можете использовать firstaction. См. Этот пример:

/mnt/user/logs/*.log  /mnt/user/logs/*/*.log {
        daily
        missingok
        rotate 7
        compress
        delaycompress
        notifempty
        su root www-data
        create 760 root www-data
        firstaction
          for file in `find  -type f -size +1024M`; do
              percent=`df -h | grep /mnt/user | awk '{print $5}' | sed 's/%//'`
              if [ $percent -gt 50 ]; then 
                  echo "Removed $file" >> /mnt/user/logs/logrotate.log
                  rm $file
              fi
           done;
        endscript
}

В этом примере вы удалили файлы размером больше, чем 1 ГБ из / mnt / пользователь раздел, если использованное пространство раздела больше, чем 50%.