Logrotate каталоги (не файлы)

У меня есть приложение, создающее файлы журналов в такой структуре:

maillog/
 2012-07-02/
  production_environment-2012-07-02__23_51_50-1341265910-some name.log
  production_environment-2012-07-02__23_51_52-1341265912-some other name.log
 ...
 2012-07-03/
   production_environment-2012-07-03__04_26_47-1341282407-third name.log
   production_environment-2012-07-03__04_26_47-1341282407-more names.log
  ...
 2012-07-04/
 ...
 2012-07-05/
 ...

Я ищу хороший способ ротации этих каталогов журналов.

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

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

Есть идеи, как это сделать?

3
задан 6 July 2012 в 14:04
1 ответ

Простой сценарий оболочки, запланированный как crontab, должен работать, учитывая, что в LOG_DIR нет других архивов, которые могут быть непреднамеренно удалены:

#!/bin/bash
DIR_ROTATE_DAYS=7
TARBALL_DELETION_DAYS=60
LOG_DIR=/var/log/<program>/

cd $LOG_DIR
log_line "compressing $LOG_DIR dirs that are $DIR_ROTATE_DAYS days old...";
for DIR in $(find ./ -maxdepth 1 -mindepth 1 -type d -mtime +"$((DIR_ROTATE_DAYS - 1))" | sort); do
  echo -n "compressing $LOG_DIR/$DIR ... ";
  if tar czf "$DIR.tar.gz" "$DIR"; then
    echo "done" && rm -rf "$DIR";
  else
    echo "failed";
  fi
done

echo "removing $LOG_DIR .tar.gz files that are $TARBALL_DELETION_DAYS days old..."
for FILE in $(find ./ -maxdepth 1 -type f -mtime +"$((TARBALL_DELETION_DAYS - 1))" -name "*.tar.gz" | sort); do
  echo -n "removing $LOG_DIR/$FILE ... ";
  if rm -f "$LOG_DIR/$FILE"; then
    echo "done";
  else
    echo "failed";
  fi
done
0
ответ дан 25 October 2021 в 18:35

Теги

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