我有一个应用程序以如下结构创建日志文件:
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不可能?)。
我犹豫着是否要自己编写这样的脚本,因为我确信有一些好的工具可以完成这种工作。
有什么想法可以解决这个问题吗?
答案1
如果 LOG_DIR 没有其他会被无意删除的 tarball,那么作为 crontab 安排的简单 shell 脚本应该可以工作:
#!/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