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