在日常管理服务器或者应用,日志文件积累了很多,需要定期备份以防止数据丢失或者方便后续分析。通常日志文件在/var/log目录下,我们可以写个脚本对/var/log目录进行备份。
#!/bin/bash
# 配置部分
LOG_DIR="/var/log" # 日志目录路径
BACKUP_DIR="/backups/logs" # 备份存储路径
RETENTION_DAYS=7 # 备份保留天数
TIMESTAMP=$(date +%Y%m%d%H%M%S) # 时间戳格式
# 创建备份目录
mkdir -p "$BACKUP_DIR" || { echo "无法创建备份目录"; exit 1; }
# 执行备份
backup_file="logs_backup_$TIMESTAMP.tar.gz"
echo "正在备份日志文件..." $(date)
if tar czf "$BACKUP_DIR/$backup_file" -C "$LOG_DIR" .; then
echo "备份成功: $BACKUP_DIR/$backup_file"
else
echo "备份失败!" >&2
exit 1
fi
# 清理旧备份
echo "清理${RETENTION_DAYS}天前的备份..."
find "$BACKUP_DIR" -name "logs_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete
使用方法:
- 将脚本保存为
log_backup.sh
- 添加执行权限:
chmod +x log_backup.sh
- 测试运行:
sudo ./log_backup.sh
测试运行结果:
解压日志文件:
设置定时任务(每天凌晨1点执行):
- 执行
crontab -e
- 添加:
0 1 * * * /path/to/log_backup.sh >/dev/null 2>&1
输出重定向 >/dev/null 2>&1
符号 | 含义 |
---|---|
> | 重定向操作符 |
/dev/null | Linux的空设备文件,写入它的内容会被丢弃(相当于黑洞) |
2> | 标准错误输出(stderr)重定向 |
&1 | 表示标准输出(stdout)的文件描述符 |
2>&1 | 将标准错误输出合并到标准输出 |
对(0 1 * * * /path/to/log_backup.sh > /dev/null 2>&1)详细解释:
">"重定向,
/dev/null
是丢弃的地方,"2>"是处理错误输出,&1
是指向同一个地方(/dev/null)。这样做,可以防止cron发送邮件,或者避免产生不必要的日志文件。可以保持系统干净,减少干扰。
可调整配置项:
LOG_DIR
: 需要备份的日志目录路径BACKUP_DIR
: 备份文件存储位置RETENTION_DAYS
: 备份保留天数- 时间戳格式(当前精确到秒)
注意事项:
- 确保执行用户有日志目录的读取权限和备份目录的写入权限
- 备份目录建议使用独立存储空间
- 如果需要备份特定日志文件(app1.log app2.log),可以修改tar命令部分
tar czf "$BACKUP_DIR/$backup_file" -C "$LOG_DIR" app1.log app2.log *.log
关键细节说明
-
时间精度:
-mtime
以 天数 为单位,最小精度是 24小时- 示例:如果现在是 2024-10-17 15:00
-mtime +7
会匹配 2024-10-10 14:59 之前的文件。
- 示例:如果现在是 2024-10-17 15:00
-
通配符匹配:
logs_backup_*.tar.gz
确保只删除备份文件,防止误删其他文件。 -
权限要求: 执行用户需要对
$BACKUP_DIR
有 写入权限。