Логротат для очистки файлов с отметкой даты - программирование
Подтвердить что ты не робот

Логротат для очистки файлов с отметкой даты

В настоящее время я пытаюсь выработать метод очистки журналов Oracle Recover, созданных Cron...

В настоящее время наш резервный процесс восстановления Oracle вызывается Cron каждые 15 минут, используя следующую команду:

0,15,30,45 * * * * /data/tier2/scripts/recover_standby.sh SID >> /data/tier2/scripts/logs/recover_standby_SID_`date +\%d\%m\%y`.log 2>&1

Это создает файлы, которые выглядят следующим образом:

$ ls -l /data/tier2/scripts/logs/
total 0
-rw-r--r-- 1 oracle oinstall 0 Feb  1 23:45 recover_standby_SID_010213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  2 23:45 recover_standby_SID_020213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  3 23:45 recover_standby_SID_030213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  4 23:45 recover_standby_SID_040213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  5 23:45 recover_standby_SID_050213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  6 23:45 recover_standby_SID_060213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  7 23:45 recover_standby_SID_070213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  8 23:45 recover_standby_SID_080213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  9 23:45 recover_standby_SID_090213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 10 23:45 recover_standby_SID_100213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 11 23:45 recover_standby_SID_110213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 12 23:45 recover_standby_SID_120213.log

Я в основном хочу удалить файлы старше, чем x дней, и я думал, что logrotate будет идеально подходит для...

Я настроил logrotate со следующим конфигурационным файлом:

/data/tier2/scripts/logs/recover_standby_*.log {
    daily
    dateext
    dateformat %d%m%Y
    maxage 7
    missingok
}

Есть ли что-то, что мне не хватает, чтобы получить желаемый результат?

Я предполагаю, что смогу удалить дату из файла журнала Crontab, а затем запустить файл rotrotate, но тогда дата в файле журнала не отражает день создания журналов... т.е. Recoveries on 010313 будет находиться в файл с датой 020313 из-за логротата на 020313 и поворота файла...

Любые другие идеи? И благодарю вас за любые ответы.

Привет

Гэвин

4b9b3361

Ответ 1

Logrotate удаляет файлы в соответствии с порядком в лексически отсортированном списке имен файлов с вращающимся журналом, а также по возрасту файлов (с использованием последнего времени модификации файла)

  • rotate - максимальное количество повернутых файлов, вы можете найти. Если количество файлов журналов с большим количеством файлов больше, их имена лексически сортируются, а лексически наименьшие - удаляются.

  • maxage определяет еще один критерий для удаления файлов с измененным журналом. Любой файл с повернутым журналом, будучи старше заданного количества дней, удаляется. Обратите внимание, что дата определяется из времени последней модификации файла, а не из имени файла.

  • dateformat позволяет задать форматирование даты во вращающихся файлах. Man page отмечает, что формат должен приводить к лексически правильной сортировке.

  • dateyesterday позволяет использовать даты в именах файлов журналов один день назад.

Чтобы сохранить заданное количество дней в ежедневных повернутых файлах (например, 7), вы должны установить значение rotate в значение 7, и вы можете игнорировать maxage, если ваши файлы создаются и поворачиваются действительно каждый день.

Если создание журнала не происходит в течение пары дней, например. в течение 14 дней количество файлов с повернутым журналом будет оставаться неизменным (7).

maxage улучшит ситуацию в сценариях, не созданных журналами, всегда удаляя слишком старые файлы. После 7 дней отсутствия производства журналов файлы вращающегося журнала не будут представлены.

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

Совет. Запустите logrotate из командной строки с параметром -d для выполнения сухого запуска: вы увидите, что сделает logrotate, но на самом деле ничего не делает. Затем выполните ручное выполнение с помощью -v (verbose), чтобы вы могли подтвердить, что сделано, что вы хотите.

Решение: чистые журналы, созданные cron

Концепция такова:

Пусть cron создает и обновляет файлы журнала, но делает небольшую модификацию для создания файлов, следуя стандартным именам файлов logrotate при использовании по умолчанию dateext

/data/tier2/scripts/logs/recover_standby_SID.log-`date +\%Y\%m\%d`.log

Использовать logrotate только для удаления слишком старых файлов журнала

  • Цель не существующего файла журнала /data/tier2/scripts/logs/recover_standby_SID.log
  • используйте missingok, чтобы выполнить очистку logrotate.
  • установите rotate достаточно высокий, чтобы покрыть количество файлов журнала, чтобы сохранить (как минимум 7, если будет один "повернутый" файл журнала в день, но вы можете безопасно установить его очень высоко, как 9999)
  • установить maxage в 7. Это приведет к удалению файлов с последним временем модификации выше 7 дней.
  • dateext используется только для обеспечения, logrotate ищет старые файлы, похожие на повернутые.

Файл конфигурации Logrotate будет выглядеть так:

data/tier2/scripts/logs/recover_standby_SID.log {
    daily
    missingok
    rotate 9999
    maxage 7
    dateext
}

Решение: вращаться непосредственно логротатом один раз в день

Я не уверен, как создается резервный файл восстановления источника, но я предполагаю, что Oracle или какой-либо из script из вас регулярно или постоянно добавляются к файлу /data/tier2/scripts/logs/recover_standby_SID.log

Концепция такова:

  • повернуть файл один раз в день на logrotate
  • работает непосредственно с файлом журнала, содержащим данные восстановления /data/tier2/scripts/logs/recover_standby_SID.log
  • daily приведет к вращению один раз в день (с точки зрения cron понимает daily)
  • rotate должно быть установлено в 7 (или любое большее число).
  • maxage установлен на 7 (дней)
  • dateext использовать суффикс даты по умолчанию для логротата
  • dateyesterday используется для того, чтобы суффиксы даты во вращающихся файлах были на один день назад.
  • missingok, чтобы очистить старые файлы, даже если нет нового содержимого для поворота.

Конфигурация Logrotate будет выглядеть так:

data/tier2/scripts/logs/recover_standby_SID.log {
    daily
    missingok
    rotate 7
    maxage 7
    dateext
    dateyesterday
}

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

Ответ 2

Вы можете использовать команду find, чтобы легко выполнить эту задачу! Он удалит все старые файлы 7 Days. Поместите его в crontab и выполните ночную основу:

$ cd /data/tier2/scripts/logs/    
$ /usr/bin/find . -mtime +7 -name "*.log" -print -delete

Или лучший способ

$ /usr/bin/find /data/tier2/scripts/logs/ -mtime +7 -name "*.log" -print -delete;

Ответ 3

(Обновлено) Ваши варианты:

  • Как ответил Сатиш, бросьте логротат и положите находку script в cron
  • Вы даже можете использовать logrotate и поместить find script в команду postrotate

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

    /opt/jboss/log/server.log.* {
    missingok
    rotate 0
    daily
    maxage 30
    }

В итоге я просто использовал то, что предложил Сатиш - простая находка с rm script в cron.

Ответ 4

(Невозможно прокомментировать как недостаточно репутацию)

У меня была аналогичная проблема. По всем счетам logrotate бесполезен для использования в именах файлов со встроенными datestamps.

Если бы все остальное было равным, я бы, вероятно, пошел с find в задание cron.

По моим собственным причинам я хотел использовать logrotate и в итоге нашел способ: fooobar.com/questions/258515/...

По сути, это был способ инкапсуляции задания cron в файл logrotate. Может быть, не самый красивый или самый эффективный, но, как я уже сказал, у меня были причины.

Ответ 5

FYI Я знаю, что это старый вопрос, но причина, по которой он не работает для вас, заключается в том, что ваш формат даты не лексически сортируется. С manpage:

   dateformat format_string
          Specify the extension for dateext using the notation similar to strftime(3)  function.  Only
          %Y  %m  %d  and %s specifiers are allowed.  The default value is -%Y%m%d. Note that also the
          character separating log name from the extension is part of the dateformat string. The  sys-
          tem  clock must be set past Sep 9th 2001 for %s to work correctly.  Note that the datestamps
          generated by this format must be lexically sortable (i.e., first the year,  then  the  month
          then  the  day.  e.g.,  2001/12/01 is ok, but 01/12/2001 is not, since 01/11/2002 would sort
          lower while it is later).  This is because when using the rotate option, logrotate sorts all
          rotated filenames to find out which logfiles are older and should be removed.

Решение состоит в том, чтобы либо перейти на тот, который идет год-месяц, либо вызвать внешний процесс для выполнения очистки.

Ответ 6

В соответствии с @Jan Vlcinsky вы можете позволить logrotate добавлять дату - просто используйте dateyesterday, чтобы получить правильную дату.

Или, если вы хотите сами ввести дату, вы можете "направить" на имя без даты, а затем имена с датой будут очищены.

Однако я обнаружил, что если у меня нет файла журнала, logrotate не выполняет очистку файлов с датами.

Но если вы готовы иметь пустой файл журнала, то его можно заставить работать.

Например, чтобы очистить /var/log/mylogfile.yyyymmdd.log через 7 дней, touch /var/log/mylogfile.log, затем настройте logrotate следующим образом:

/var/log/mylogfile.log
{
        daily
        rotate 7
        maxage 7
        dateext
        dateformat .%Y%m%d
        extension .log
        ifempty
        create
}

Эта запись, в сочетании с существованием mylogfile.log, запускает logrotate для очистки старых файлов, как если бы они были созданы с помощью logrotate.

daily, rotate plus maxage заставляют старые файлы журналов удаляться через 7 дней (или 7 старых файлов журнала, в зависимости от того, что наступит раньше).

dateext, dateformat plus extension заставляет logrotate соответствовать нашим именам файлов.

И ifempty plus create убедитесь, что там по-прежнему остается пустой файл, или остановка журнала остановится.

Еще один совет для тестирования, будьте готовы отредактировать /var/lib/logrotate.status до reset дата последнего поворота или logrotate ничего не сделает для вас.