logrotate весь каталог, содержащий файлы журнала

Есть ли способ, используя logrotate, я могу вращать весь каталог и сжимать его, а не только файлы в определенном каталоге? Я попытался экспериментировать, используя конфигурацию ниже, но это не работает. Дайте сообщение об ошибке ниже:

Config:

/path/to/folder/test {
daily
rotate 5
missingok
compress
delaycompress
}

Ошибка:

$logrotate -vf test.conf
reading config file test.conf
reading config info for /path/to/folder/test

Handling 1 logs

rotating pattern: /path/to/folder/test  forced from command line (5 
rotations)
empty log files are rotated, old logs are removed
error: error creating unique temp file: Permission denied

3 ответа

Logrotate работает только с отдельными файлами в каталогах, а не со всем каталогом как с единым целым. Самым простым решением будет cronjob, который вызывает в этом каталоге что-то вроде gzip, а затем перемещает / удаляет файлы по своему усмотрению.

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

      /path/to/folder/test/file1
/path/to/folder/test/file2
 {
    daily
    rotate 5
    missingok
    compress
    delaycompress
    }

Простой сценарий оболочки, запланированный как 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
Другие вопросы по тегам