Linux服务器使用Cron实现日志自动清理方案

 更新时间:2026年01月19日 08:34:04   作者:爱琴孩  
本文详细介绍了如何使用find和cron组合实现Linux服务器日志的自动化清理,包括日志目录分析、解决方案设计、实施步骤、验证与测试以及find命令的详细解析,需要的朋友可以参考下

一、背景问题

在生产环境中,随着服务持续运行,日志文件会不断累积,占用大量磁盘空间。以某开发测试服务器为例:

  • 日志目录/data/logs
  • 服务数量:100+ 个微服务
  • 磁盘占用:28G
  • 待清理文件:24267 个(超过 7 天)

如果不及时清理,可能导致磁盘空间不足,影响服务正常运行。

二、日志目录分析

2.1 目录结构

/data/logs/
├── cas_logs/                    # CAS认证服务日志
├── nginx/                       # Nginx日志
├── ttpt_cas/                    # 平台CAS日志
├── yyzx_testservice_logs/       # 测试服务日志
├── ... (100+ 服务目录)
├── spring.log                   # 散落的日志文件
└── spring.log.2025-12-31.log

2.2 日志文件命名规则

通过分析,发现日志文件主要有以下几种命名格式:

格式示例
服务名-YYYY-MM-DD-HH-序号.logcas-2022-01-04-11-1.log
服务名.log.YYYY-MM-DD.logttpt_gmservice_logs.log.2026-01-08.log
access_log.YYYY-MM-DD.logaccess_log.2026-01-08.log
*.gz压缩后的历史日志

三、解决方案设计

3.1 技术方案

使用 find + cron 组合实现自动化日志清理:

  • find 命令:按文件类型和修改时间筛选日志文件
  • cron 定时任务:每天定时执行清理脚本
  • 日志记录:记录每次清理操作,便于追溯

3.2 安全措施

安全措施说明
目录限制只在 /data/logs 目录下操作
文件类型限制只删除 *.log*.log.**.gz 文件
只删文件使用 -type f,不删除目录
时间限制只删除 7 天前的文件(-mtime +7
操作日志记录每次清理的时间和文件数量

四、实施步骤

4.1 创建脚本目录

mkdir -p /data/scripts

4.2 创建清理脚本

创建文件 /data/scripts/clean_old_logs.sh

#!/bin/bash
#
# 日志清理脚本 - 删除7天前的日志文件
# 每天早上9点由cron定时执行
# 
# 安全措施:
# 1. 只在 /data/logs 目录下操作
# 2. 只删除日志文件(*.log, *.log.*, *.gz)
# 3. 只删除文件,不删除目录
# 4. 记录清理日志
#
​
LOG_DIR="/data/logs"
DAYS=7
SCRIPT_LOG="/data/scripts/clean_logs_history.log"
​
# 确保只在 /data/logs 目录下操作
if [ ! -d "$LOG_DIR" ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误: 目录 $LOG_DIR 不存在" >> "$SCRIPT_LOG"
    exit 1
fi
​
# 记录开始时间
echo "$(date '+%Y-%m-%d %H:%M:%S') - 开始清理 ${DAYS} 天前的日志文件..." >> "$SCRIPT_LOG"
​
# 统计将要删除的文件数量
COUNT=$(find "$LOG_DIR" -type f \( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) -mtime +$DAYS 2>/dev/null | wc -l)
​
# 删除日志文件
find "$LOG_DIR" -type f \( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) -mtime +$DAYS -delete 2>/dev/null
​
# 记录完成
echo "$(date '+%Y-%m-%d %H:%M:%S') - 清理完成,共删除 $COUNT 个文件" >> "$SCRIPT_LOG"

4.3 赋予执行权限

chmod +x /data/scripts/clean_old_logs.sh

4.4 配置 Cron 定时任务

# 添加定时任务(每天早上9点执行)
(crontab -l 2>/dev/null | grep -v "clean_old_logs.sh"; echo "0 9 * * * /bin/bash /data/scripts/clean_old_logs.sh") | crontab -
​
# 验证是否添加成功
crontab -l

Cron 表达式说明

0 9 * * * /bin/bash /data/scripts/clean_old_logs.sh
│ │ │ │ │
│ │ │ │ └── 星期几 (0-7, 0和7都表示周日)
│ │ │ └──── 月份 (1-12)
│ │ └────── 日期 (1-31)
│ └──────── 小时 (0-23)
└────────── 分钟 (0-59)

五、验证与测试

5.1 预览待删除文件

# 查看将被删除的文件数量
find /data/logs -type f \( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) -mtime +7 2>/dev/null | wc -l
​
# 查看部分文件列表
find /data/logs -type f \( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) -mtime +7 2>/dev/null | head -20

5.2 手动执行测试

# 执行清理脚本
/bin/bash /data/scripts/clean_old_logs.sh
​
# 查看清理记录
cat /data/scripts/clean_logs_history.log
​
# 查看磁盘使用变化
du -sh /data/logs

5.3 查看 Cron 执行日志

# 查看系统 cron 日志
tail -f /var/log/cron
​
# 查看清理历史记录
cat /data/scripts/clean_logs_history.log

六、find 命令详解

6.1 核心参数说明

参数说明
-type f只匹配文件,不匹配目录
-name "*.log"匹配文件名模式
-o逻辑或,连接多个匹配条件
-mtime +7修改时间超过 7 天
-delete删除匹配的文件
2>/dev/null忽略权限不足等错误信息

6.2 时间参数对比

参数含义
-mtime +7修改时间 > 7 天前
-mtime 7修改时间 = 7 天前
-mtime -7修改时间 < 7 天前(7 天内)
-atime访问时间
-ctime状态改变时间

七、排除或指定目录清理

7.1 如何排除某些目录不清理?

在 find 命令中添加 -not -path 参数:

find "$LOG_DIR" -type f \
    -not -path "*/kafka-logs/*" \
    -not -path "*/nginx/*" \
    \( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) \
    -mtime +$DAYS -delete

7.2 如何只清理特定服务的日志?

修改 LOG_DIR 或添加路径过滤:

# 只清理特定服务
LOG_DIR="/data/logs/yyzx_testservice_logs"
​
# 或使用通配符匹配多个服务
find /data/logs/yyzx_* -type f -name "*.log" -mtime +7 -delete

八、总结

本方案通过 find + cron 实现了服务器日志的自动化清理:

项目配置
清理目录/data/logs
保留天数7 天
执行时间每天 09:00
清理记录/data/scripts/clean_logs_history.log

核心优势

  • ✅ 自动化执行,无需人工干预
  • ✅ 安全限制,避免误删重要文件
  • ✅ 操作留痕,便于问题追溯
  • ✅ 配置灵活,易于调整参数

以上就是Linux服务器使用Cron实现日志自动清理方案的详细内容,更多关于Linux Cron日志自动清理的资料请关注脚本之家其它相关文章!

相关文章

  • Ubuntu安装scrcpy完成手机投屏和控制(Ubuntu用QQ微信的另一种方法)

    Ubuntu安装scrcpy完成手机投屏和控制(Ubuntu用QQ微信的另一种方法)

    这篇文章主要介绍了Ubuntu安装scrcpy手机投屏和控制(Ubuntu用QQ微信的另一种方法),这样的话不用频繁在键盘和手机间切换了 ,需要的朋友可以参考下
    2019-10-10
  • linux引导系统的方法分析

    linux引导系统的方法分析

    这篇文章主要介绍了linux引导系统的方法,总结分析了Linux引导系统相关原理、操作命令与注意事项,需要的朋友可以参考下
    2020-03-03
  • KLOXO重置管理员登陆密码的方法分享

    KLOXO重置管理员登陆密码的方法分享

    今天准备整理面板的配置问题的,登陆密码忘记了,郁闷不已。我们只有通过SSH来重置KLOXO初始密码
    2012-09-09
  • Linux使用fdisk进行磁盘的相关操作

    Linux使用fdisk进行磁盘的相关操作

    fdisk 命令是 Linux 中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下
    2025-01-01
  • ubuntu下安装Python多版本的方法及注意事项

    ubuntu下安装Python多版本的方法及注意事项

    倒霉的今天我居然把ubuntu系统给完坏了,因为我把python3卸载了,然后就哦了,下面小编给大家分享下ubuntu下管理python的多个版本的方法,本文给大家介绍的非常详细,感兴趣的朋友一起看下吧
    2016-10-10
  • centos7中firewall防火墙命令详解

    centos7中firewall防火墙命令详解

    本篇文章主要介绍了centos7中firewall防火墙命令详解,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • Linux之httpd启动或重启报错问题及解决

    Linux之httpd启动或重启报错问题及解决

    文章提供了一个解决HTTPD服务配置错误的步骤,包括查看日志、使用systemctl命令检查服务状态、定位并注释错误配置行,最终成功重启服务
    2026-04-04
  • ubuntu如何开启ssh远程登录

    ubuntu如何开启ssh远程登录

    在Ubuntu上开启SSH远程登录的步骤如下:检查SSH安装情况、启动SSH服务、设置开机启动、检查SSH状态、配置防火墙、并使用SSH客户端进行远程登录
    2025-03-03
  • 基于Ubuntu 18.04配置固定IP的方法教程

    基于Ubuntu 18.04配置固定IP的方法教程

    最近新装的Ubuntu 18.04还是不习惯,但还是要努力适应,下面这篇文章主要给大家介绍了关于基于Ubuntu 18.04配置固定IP的方法教程,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-08-08
  • 在Linux系统上刷新DNS缓存的方法

    在Linux系统上刷新DNS缓存的方法

    DNS是互联网的一项服务,它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,而不用记住能够被机器直接读取的 IP 数串,但是,有时候我们可能需要刷新或清除 DNS 缓存,本文将详细介绍如何在Linux系统上刷新DNS缓存,需要的朋友可以参考下
    2024-06-06

最新评论