Logrotate 目录(不是文件)

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不可能?)。

我犹豫着是否要自己编写这样的脚本,因为我确信有一些好的工具可以完成这种工作。

有什么想法可以解决这个问题吗?

答案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

相关内容