使用 Python 编写定时任务脚本:指定时间清理日志文件
在服务器运维或应用程序开发中,日志文件(如 access.log、error.log)会随着时间推移不断积累,占用大量存储空间。为了保持系统整洁和高效运行,通常需要定期清理过期日志。本文将详细介绍如何使用 Python 编写一个定时任务脚本,根据指定时间自动清理日志文件,并提供完整代码示例与部署建议。
一、核心需求与技术选型
1.1 需求分析
- 目标:每天凌晨(如 00:00)自动清理指定目录下超过 7 天 的日志文件。
- 功能要求:
- 遍历日志目录,筛选出超过保留期限的文件。
- 安全删除文件(避免误删关键数据)。
- 脚本可配置时间、路径和保留天数。
- 支持跨平台运行(Linux/Windows)。
1.2 技术选型
- Python 标准库:
os(文件操作)、datetime(时间计算)、time(定时循环)。 - 第三方库:
schedule(简化定时任务调度)。 - 优势:无需依赖外部服务(如
cron),代码自包含,易于部署。
二、核心模块详解
2.1 文件筛选与删除
使用 os.listdir() 遍历目录,结合 os.path.getmtime() 获取文件修改时间,并与当前时间比较,判断是否超过保留天数。
import os
import datetime
LOG_DIR = "/var/logs/app" # 日志目录
RETENTION_DAYS = 7 # 保留天数
def clean_logs():
now = datetime.datetime.now()
for filename in os.listdir(LOG_DIR):
file_path = os.path.join(LOG_DIR, filename)
if os.path.isfile(file_path): # 仅处理文件
file_mtime = datetime.datetime.fromtimestamp(os.path.getmtime(file_path))
if (now - file_mtime).days > RETENTION_DAYS:
try:
os.remove(file_path)
print(f"[DELETE] {file_path}")
except Exception as e:
print(f"[ERROR] 删除失败: {file_path}, 错误: {e}")
注意事项:
- 安全性:确保
LOG_DIR路径正确,避免误删其他文件。 - 异常处理:捕获权限错误(如文件被占用)或路径不存在的异常。
2.2 定时任务调度
使用 schedule 库设置定时规则,例如每天凌晨执行一次任务。
import schedule
import time
def job():
print("[INFO] 开始清理日志...")
clean_logs()
print("[INFO] 清理完成。")
# 设置定时规则
schedule.every().day.at("00:00").do(job)
# 持续运行调度器
while True:
schedule.run_pending()
time.sleep(1) # 避免 CPU 空转
优点:
- 简单易用:通过
at("HH:MM")精确控制执行时间。 - 跨平台兼容:无需依赖操作系统级别的任务计划。
三、完整代码示例
import os
import datetime
import schedule
import time
# 配置参数
LOG_DIR = "/var/logs/app" # 日志目录(需替换为实际路径)
RETENTION_DAYS = 7 # 保留天数
EXECUTION_TIME = "00:00" # 执行时间(24小时制)
def clean_logs():
"""清理过期日志"""
now = datetime.datetime.now()
for filename in os.listdir(LOG_DIR):
file_path = os.path.join(LOG_DIR, filename)
if os.path.isfile(file_path):
file_mtime = datetime.datetime.fromtimestamp(os.path.getmtime(file_path))
if (now - file_mtime).days > RETENTION_DAYS:
try:
os.remove(file_path)
print(f"[DELETE] {file_path}")
except Exception as e:
print(f"[ERROR] 删除失败: {file_path}, 错误: {e}")
def job():
"""定时任务主体"""
print(f"[INFO] {datetime.datetime.now()} 开始清理日志...")
clean_logs()
print(f"[INFO] 清理完成。")
def main():
"""初始化调度器"""
# 设置定时规则
schedule.every().day.at(EXECUTION_TIME).do(job)
# 首次立即执行一次
job()
# 持续运行调度器
while True:
schedule.run_pending()
time.sleep(1) # 降低 CPU 占用
if __name__ == "__main__":
main()
四、配置与部署
4.1 安装依赖
schedule 是第三方库,需通过 pip 安装:
pip install schedule
4.2 参数配置
- 日志目录:修改
LOG_DIR为实际路径(如/home/user/logs)。 - 保留天数:调整
RETENTION_DAYS。 - 执行时间:修改
EXECUTION_TIME(如"02:30")。
4.3 跨平台运行
- Linux/Unix:直接运行脚本:
python3 log_cleaner.py - Windows:使用
py或pythonw后台运行:py log_cleaner.py
4.4 后台运行与持久化
- Linux:使用
nohup或screen保持进程运行:nohup python3 log_cleaner.py > /dev/null 2>&1 & - Windows:通过任务计划程序设置开机自启,或使用
pyinstaller打包为.exe。
五、扩展功能建议
5.1 日志记录
添加日志文件记录操作信息(如删除记录、错误详情):
import logging
logging.basicConfig(filename='cleaner.log', level=logging.INFO)
logging.info("开始清理日志")
5.2 白名单过滤
仅清理符合特定命名规则的日志(如 *.log):
if filename.endswith(".log"):
# 执行删除逻辑
5.3 邮件通知
在清理完成后发送邮件通知管理员(需配置 SMTP):
import smtplib
from email.mime.text import MIMEText
def send_email(subject, content):
msg = MIMEText(content)
msg['Subject'] = subject
msg['From'] = "admin@example.com"
msg['To'] = "admin@example.com"
with smtplib.SMTP("smtp.example.com") as server:
server.send_message(msg)
六、注意事项与最佳实践
6.1 权限管理
- 文件权限:确保脚本对日志目录有读写权限。
- 最小权限原则:避免以 root 用户运行脚本,降低安全风险。
6.2 测试验证
- 手动测试:先在小范围目录中验证脚本逻辑。
- 模拟删除:用
print替代os.remove(),观察输出结果。
6.3 备份策略
- 定期备份:对重要日志设置备份机制(如压缩归档旧日志)。
- 软链接:使用符号链接指向新目录,避免误删活跃日志。
七、总结
通过 Python 实现定时清理日志的脚本,开发者可以灵活控制任务的执行时间、清理规则和部署方式。结合 schedule 库的简洁 API 和标准库的文件操作,该方案具有以下优势:
- 轻量级:无需依赖外部调度服务。
- 可定制化:支持参数配置、白名单过滤、日志记录等扩展功能。
- 跨平台兼容:适用于 Linux/Windows 环境。
实际应用中,建议结合系统任务计划(如 cron 或 Windows 任务计划程序)进一步提高稳定性,并通过日志和监控确保脚本长期可靠运行。

9021

被折叠的 条评论
为什么被折叠?



