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

8

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

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

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

КДТ
источник
1
Ведение журналов до заполнения диска можно применять в физических средах, но, поскольку мы в основном переходим на виртуальные серверы и облако, размер файловой системы должен быть как можно меньше, чтобы снизить затраты. В этом случае вы не можете избежать определения политики хранения.
jfg956

Ответы:

9

Возможно, вы можете использовать директивы 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 о типе скрипта, который вы можете запустить:

/programming/7523059/remove-oldest-file-in-repository

CJC
источник
1

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

johnshen64
источник
Если у вас есть все в одной файловой системе, это может быть не очень хорошая идея. Тем не менее, мои журналы находятся в собственной файловой системе, чтобы не мешать чему-либо еще.
КДТ
ну ладно, если у них есть только их fs, становится проще иметь скрипт для очистки, dh / fs и использовать awk или cut для извлечения% используется, и, основываясь на этом рисунке, вы можете начать поиск с помощью exec гт. я часто не пишу сценарий и просто помещаю однострочник в сам crontab.
johnshen64
0

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

Тим Бригам
источник
0

Как предложил @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 / user, если используемое пространство раздела превышает 50% .

esguti
источник