复制成功
请遵守本站许可
REPORT
Chapter_Post // Field_Report

Post_Ref: RL-日志轮转与压缩脚

2026.04.08

日志轮转与压缩脚本

Echo HaoRan
Echo HaoRan
#StudyProject#practice#Shell练习
ANALYSIS
  • 要求
PRTCL // SHELL
Terminal window
自动备份日志文件(如 `app.log` `app.log.1`
压缩旧日志(使用 `gzip` 节省空间)
保留最近 N 份日志(默认保留 7 天)
安全处理:不删除原日志直到新日志创建成功
适合放入 `crontab` 定时执行

PRTCL // SHELL
logrotate_simple.sh
#!/bin/bash
# ==============================================================================
# 功能: 简单的日志轮转与压缩脚本(适合初学者学习和使用)
# 作者: 汪号然
# 用法:
# chmod +x logrotate_simple.sh
# ./logrotate_simple.sh /path/to/your.log
# 可配合 crontab 每天自动运行
# ==============================================================================
# 检查是否传入了日志文件路径
if [ $# -eq 0 ]; then
echo "错误: 请提供要轮转的日志文件路径"
echo "用法: $0 /path/to/your.log"
exit 1
fi
# 获取用户传入的日志文件路径
LOG_FILE="$1"
# 检查日志文件是否存在
if [ ! -f "$LOG_FILE" ]; then
echo "错误: 日志文件不存在: $LOG_FILE"
exit 1
fi
# 设置保留的旧日志数量(例如保留最近 7 份)
MAX_BACKUPS=7
# 获取日志文件所在目录和文件名(不带路径)
LOG_DIR=$(dirname "$LOG_FILE")
LOG_BASENAME=$(basename "$LOG_FILE")
echo "开始轮转日志: $LOG_FILE"
# =============== 第一步:删除最旧的备份(如果超过 MAX_BACKUPS)===============
# 例如:如果 MAX_BACKUPS=7,就删除 app.log.7.gz
OLDEST_BACKUP="${LOG_DIR}/${LOG_BASENAME}.${MAX_BACKUPS}.gz"
if [ -f "$OLDEST_BACKUP" ]; then
echo "删除最旧备份: $OLDEST_BACKUP"
rm -f "$OLDEST_BACKUP"
fi
# =============== 第二步:将旧备份依次后移(从大到小移动,避免覆盖)===============
# 例如:app.log.6.gz → app.log.7.gz, app.log.5.gz → app.log.6.gz, ...
for ((i=MAX_BACKUPS-1; i>=1; i--)); do
CURRENT_BACKUP="${LOG_DIR}/${LOG_BASENAME}.${i}.gz"
NEXT_BACKUP="${LOG_DIR}/${LOG_BASENAME}.$((i+1)).gz"
# 如果当前编号的备份存在,就把它重命名为下一个编号
if [ -f "$CURRENT_BACKUP" ]; then
echo "移动: $CURRENT_BACKUP$NEXT_BACKUP"
mv "$CURRENT_BACKUP" "$NEXT_BACKUP"
fi
done
# =============== 第三步:压缩当前日志文件为 .1.gz ===============================
# 例如:app.log → app.log.1.gz
CURRENT_LOG_BACKUP="${LOG_DIR}/${LOG_BASENAME}.1.gz"
# 先压缩原日志文件(保留原文件)
echo "压缩当前日志为: $CURRENT_LOG_BACKUP"
gzip -c "$LOG_FILE" > "$CURRENT_LOG_BACKUP"
# =============== 第四步:清空原日志文件(而不是删除!)==========================
# 原因:很多程序会一直写入原文件句柄,删除会导致文件描述符失效
# 正确做法:清空内容,保留 inode
echo "清空原日志文件: $LOG_FILE"
> "$LOG_FILE"
echo "日志轮转完成!"
echo "保留的备份: ${LOG_DIR}/${LOG_BASENAME}.[1-${MAX_BACKUPS}].gz"
R P
Rhine Lab Pioneer Division
Auth_Verified: 2026.04.08
// END OF POST

订阅

通过 RSS 订阅本站,新文章发布时第一时间收到通知。

Follow
Classified
Chapter_06
Protocol_Ref: CC-BY-NC-SA-4.0

日志轮转与压缩脚本

Author: CHONGXIReleased: 2026.04.08

Licensed under CC BY-NC-SA 4.0

评论

© 2025-2026 EchoSpace
Powered by Astro & echohaoran Non-Collaborative_Entity // Protocol_V.4.21