【Linux】脚本:console.log 日志定期备份清理


SpringBoot 项目部署至 Linux 服务器后,控制台输出的 console.log 日志会持续累积、无限增长,不仅占用大量磁盘空间,还会拖慢日志检索效率,甚至引发磁盘告警。

本篇分享一套通用、安全、无侵入 的日志自动化管理方案:每天凌晨2点自动备份前一日日志、自动清理7天前过期日志,支持手动配置多项目日志路径,全程不重启服务、不丢失日志、不影响业务程序正常运行。

====== 🌟 青柠来相伴,代码更简单。🌟 ======

📚 本文所有内容,我都整理成了文档资料。👇

🎯 搜索【青柠代码录】,关键字:青柠合集

🚀 即可查看所有博客文章 ~

====== 🌟 ================= 🌟 ======


一、核心需求

  • 定时自动化:每天凌晨2点静默执行,无需人工值守干预
  • 规范命名 :备份日志命名为 console-2026-03-18.log,清爽规整、便于检索
  • 多路径适配:手动指定多个服务的 console.log 路径,一套脚本通用所有项目
  • 安全稳定:不中断程序进程、不丢失日志数据、无需重启 SpringBoot 服务
  • 自动清理:保留最近7天日志,过期日志自动删除,严控磁盘占用
  • 执行可追溯:脚本运行过程全程记录,方便排查异常、核对执行结果

二、最终脚本

创建脚本文件(推荐路径:/opt/clean_logs.sh),复制以下内容,仅需修改日志路径即可使用。

复制代码
#!/bin/bash

# ====================== 核心配置(仅修改此处即可) ======================
# 多项目console.log路径,一行一个,无需逗号,双引号包裹完整路径
LOG_PATHS=(
  "/home/service1/console.log"
  "/home/service2/console.log"
  "/usr/local/app/console.log"
  "/opt/api/console.log"
)

# 日志保留天数,超出该天数自动清理
KEEP_DAYS=7
# 脚本自身执行日志路径,完整记录每次运行详情
SCRIPT_LOG="/opt/clean_logs_detail.log"
# ======================================================================

# 格式化日期变量
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
CURRENT_DATETIME=$(date '+%Y-%m-%d %H:%M:%S')

# 日志输出函数:同步打印至终端+写入脚本日志文件
write_log() {
  local LOG_CONTENT="[${CURRENT_DATETIME}] $1"
  echo "${LOG_CONTENT}"
  echo "${LOG_CONTENT}" >> "${SCRIPT_LOG}"
}

# 任务开始标记
write_log "==================== 日志备份清理任务启动 ===================="

# 批量备份并清空当前日志
for LOG_PATH in "${LOG_PATHS[@]}"; do
  # 判断日志文件是否存在
  if [ -f "${LOG_PATH}" ]; then
    LOG_DIR=$(dirname "${LOG_PATH}")
    BACKUP_FILE="${LOG_DIR}/console-${YESTERDAY}.log"
    
    # 安全备份:复制日志后清空原文件,不影响程序文件句柄
    cat "${LOG_PATH}" > "${BACKUP_FILE}"
    > "${LOG_PATH}"
    write_log "备份成功:${BACKUP_FILE},原日志已清空"
  else
    write_log "警告:日志文件不存在,跳过处理 → ${LOG_PATH}"
  fi
done

# 批量清理过期日志
write_log "开始清理 ${KEEP_DAYS} 天前的历史日志"
for LOG_PATH in "${LOG_PATHS[@]}"; do
  if [ -f "${LOG_PATH}" ]; then
    LOG_DIR=$(dirname "${LOG_PATH}")
    # 仅清理按日期备份的日志,绝不触碰当前正在写入的console.log
    find "${LOG_DIR}" -name "console-*.log" -mtime +${KEEP_DAYS} -delete
  fi
done

write_log "过期日志清理完成"
write_log "==================== 本次任务执行结束 ===================="
echo "" >> "${SCRIPT_LOG}"

脚本关键说明

为什么不直接重命名日志文件?

SpringBoot 启动后会持有日志文件句柄,直接用 mv 重命名,会导致程序继续往旧文件写入日志,造成日志割裂丢失。

采用 cp 备份 + 清空原文件 的方式,程序无感切换,全程不中断、不丢日志。

  • LOG_PATHS :数组格式,一行一个日志路径,纯换行分隔, 严禁加逗号、分号,支持任意数量 SpringBoot 服务
  • KEEP_DAYS:日志保留天数,默认7天,可按需改为15/30天,仅清理日期命名的备份日志
  • SCRIPT_LOG:脚本执行日志路径,自动记录每次备份、清理、异常信息,运维排查更便捷
  • 安全机制:cp 复制备份+清空原文件,不修改程序文件句柄,SpringBoot 无感运行,不丢日志、不中断服务
  • 命名规范 :备份日志命名为 console-yyyy-MM-dd.log,摒弃冗余符号,目录结构更清爽

三、实操部署步骤

步骤1:赋予脚本执行权限

脚本创建完成后,执行以下命令赋予执行权限,否则无法正常运行:

复制代码
chmod +x /opt/clean_logs.sh

步骤2:测试过期日志删除

担心误删重要日志?

可单独执行以下命令,仅预览待删除文件、不实际执行删除,替换为对应日志目录即可:

复制代码
# 预览7天前的日志文件,核对无误后再执行清理
find /home/service1 -name "console-*.log" -mtime +7
find /home/service2 -name "console-*.log" -mtime +7

步骤3:手动测试(必做环节)

正式配置定时任务前,务必先手动运行测试,验证备份、清空、清理功能是否正常,全程不影响程序运行:

注意:!!!

如果文件文件过大,并且 console.log 日志文件可以清理,可以先执行一次

> /home/service1/console.log

来释放磁盘空间

复制代码
# 执行脚本,查看实时输出结果
bash /opt/clean_logs.sh

测试验证标准

  1. 终端输出完整执行流程,同步写入 /opt/clean_logs_detail.log 日志文件
  2. 对应日志目录生成 console-yyyy-MM-dd.log 格式的备份文件
  3. 原 console.log 文件大小归0,程序持续正常写入日志
  4. SpringBoot 服务无报错、无需重启,业务完全不受影响
  5. 可通过命令查看脚本执行日志: tail -20 /opt/clean_logs_detail.log

步骤4:配置定时任务(crontab)

测试无误后,配置每天凌晨2点自动执行,避开业务高峰期,避免影响服务:

复制代码
# 编辑定时任务
crontab -e

在文件末尾添加以下配置,保存退出(:wq)即可生效:

复制代码
# 每天凌晨2点执行日志备份清理脚本
0 2 * * * /opt/clean_logs.sh

脚本内置双日志输出机制

手动执行时终端实时显示,后台定时执行时全程写入 /opt/clean_logs_detail.log,无需额外配置重定向;脚本仅清理历史备份日志,绝对不会误删当前正在写入的 console.log


四、常见问题避坑

1. 数组路径需要加逗号吗?

不需要! Linux 数组通过空格或换行分隔,严禁添加逗号、分号,否则会导致脚本报错失效。正确格式如下:

复制代码
LOG_PATHS=(
  "/路径1/console.log"
  "/路径2/console.log"
)

2. 脚本执行后程序没反应?

这是正常现象!脚本采用安全备份模式,程序会无感切换至新的空日志文件继续写入,无需重启服务,完全不影响业务运行。

3. 日志未备份/未清理?

  • 检查日志路径是否填写正确,区分大小写、无多余空格、路径完整包裹
  • 确认脚本已赋予执行权限: ls -l /opt/clean_logs.sh 查看是否有 x 权限
  • 查看脚本执行日志定位问题: cat /opt/clean_logs_detail.log
  • 确认定时任务是否加载成功:执行 crontab -l 查看配置是否存在

五、最终效果展示

每个服务的日志目录结构清爽规整,自动保留最近7天日志,磁盘空间精准可控:

复制代码
home/service1/
├── console.log           # 当前正在写入的活跃日志
├── console-2026-03-18.log
├── console-2026-03-17.log
├── console-2026-03-16.log
├── console-2026-03-15.log
├── console-2026-03-14.log
├── console-2026-03-13.log
└── console-2026-03-12.log

本文由mdnice多平台发布

相关推荐
Victor3565 小时前
MongoDB(87)如何使用GridFS?
后端
Victor3566 小时前
MongoDB(88)如何进行数据迁移?
后端
小红的布丁6 小时前
单线程 Redis 的高性能之道
redis·后端
GetcharZp6 小时前
Go 语言只能写后端?这款 2D 游戏引擎刷新你的认知!
后端
宁瑶琴7 小时前
COBOL语言的云计算
开发语言·后端·golang
普通网友8 小时前
阿里云国际版服务器,真的是学生党的性价比之选吗?
后端·python·阿里云·flask·云计算
IT_陈寒8 小时前
Vue的这个响应式问题,坑了我整整两小时
前端·人工智能·后端
Soofjan9 小时前
Go 内存回收-GC 源码1-触发与阶段
后端
shining9 小时前
[Golang]Eino探索之旅-初窥门径
后端
掘金者阿豪9 小时前
Mac 程序员效率神器:6 个我每天都在用的 Mac 工具推荐(Alfred / Paste / PixPin / HexHub / iTerm2 /)
后端