【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多平台发布

相关推荐
陈随易2 小时前
站在普通开发者的角度,我觉得 RollCode 更像是“把 H5 交付这件事重新捋顺了”
前端·后端·程序员
陈随易3 小时前
RollCode:不只是在做页面,而是在缩短“从需求到上线”的整条链路
前端·后端
y = xⁿ3 小时前
【LeetCodehot100】二叉树大合集 T94:二叉树的中序遍历 T104:二叉树的最大深度 T226:翻转二叉树 T101:对称二叉树
后端·算法·深度优先
2501_921649493 小时前
美股历史 K线数据 API接口综合评测与接入指南
后端·python·websocket·金融·restful
码界奇点4 小时前
基于ASP.NET Core的内容管理系统设计与实现
c++·后端·车载系统·毕业设计·asp.net·源代码管理
IT_陈寒4 小时前
React开发者都在偷偷用的5个性能优化黑科技,你知道几个?
前端·人工智能·后端
wuyaolong0074 小时前
Spring Boot 3.4 正式发布,结构化日志!
java·spring boot·后端
番茄去哪了4 小时前
Java基础面试题day01
java·开发语言·后端·javase·八股·面向对象编程
用户8356290780514 小时前
Python 设置 Excel 条件格式教程
后端·python·excel