使用shell脚本按周切割日志可避免磁盘占满,核心是通过date +%Y%V获取周标识,判断周变更后移动日志并重建文件,结合crontab每周一执行,确保服务不中断。

Linux系统中日志文件会随着时间不断增长,过大的日志不仅影响查看效率,还可能占满磁盘空间。为解决这个问题,可以使用shell脚本实现按周自动切割日志。相比logrotate等工具,自定义脚本更灵活,适合特定业务场景。
一、按周切割日志的核心思路
每周将当前日志归档一次,归档文件名包含年份和周数(如app_2024_W15.log),原日志清空或重命名后新建。关键点:
- 通过date +%Y_%V获取当前年份和周数
- 判断是否为本周首次执行(避免重复切割)
- 移动旧日志并清空原文件句柄
- 配合crontab定时执行
二、编写按周切割的shell脚本
以下是一个通用的日志按周切割脚本示例:
#!/bin/bash日志源文件路径
LOG_FILE="/var/log/myapp.log"
归档目录
ARCHIVE_DIR="/var/log/archive"
获取年份+周数(如:2024_15)
WEEKTAG=$(date +%Y%V)
创建归档目录
[ ! -d "$ARCHIVE_DIR" ] && mkdir -p "$ARCHIVE_DIR"
上周标记(用于判断是否已处理)
LAST_WEEK_FILE="$ARCHIVE_DIR/.last_week"
读取上次处理的周数,若无则初始化
if [ -f "$LAST_WEEK_FILE" ]; then LAST_PROCESSED=$(cat "$LAST_WEEK_FILE") else LAST_PROCESSED="" fi
如果当前周未处理,则进行切割
if [ "$WEEK_TAG" != "$LAST_PROCESSED" ]; then if [ -f "$LOG_FILE" ] && [ -s "$LOG_FILE" ]; then
移动日志到归档目录
mv "$LOG_FILE" "$ARCHIVE_DIR/myapp_${WEEK_TAG}.log" # 重新创建空日志文件并保留权限 touch "$LOG_FILE" chown --reference="$ARCHIVE_DIR/myapp_${WEEK_TAG}.log" "$LOG_FILE" 2youjiankuohaophpcn/dev/null || true chmod --reference="$ARCHIVE_DIR/myapp_${WEEK_TAG}.log" "$LOG_FILE" 2youjiankuohaophpcn/dev/null || true fi # 更新最后处理周数 echo "$WEEK_TAG" youjiankuohaophpcn "$LAST_WEEK_FILE"fi
三、配置定时任务自动执行
使用crontab每周一凌晨执行脚本:
- 保存脚本为/opt/scripts/rotate_log_by_week.sh
- 添加可执行权限:chmod +x /opt/scripts/rotate_log_by_week.sh
- 编辑定时任务:crontab -e
- 添加如下行(每周一0点10分执行):
10 0 * * 1 /opt/scripts/rotate_log_by_week.sh四、注意事项与优化建议
实际部署时注意以下几点:
- 确保运行脚本的用户对日志文件有读写权限
- 应用需支持日志文件被清空或重写(多数服务支持)
- 长期归档日志建议增加压缩功能(用gzip压缩)
- 可加入简单的日志记录功能,便于排查问题
- 定期清理过期归档(如保留最近8周)
基本上就这些。通过简单的shell脚本加cron,就能实现稳定可靠的按周日志切割机制,无需依赖额外软件,适合轻量级运维需求。关键是判断周变更和正确处理文件句柄,避免服务中断。不复杂但容易忽略细节。










