使用 Python 编写定时任务脚本:指定时间清理日志文件

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

使用 Python 编写定时任务脚本:指定时间清理日志文件

在服务器运维或应用程序开发中,日志文件(如 access.logerror.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:使用 pypythonw 后台运行:
    py log_cleaner.py
    

4.4 后台运行与持久化

  • Linux:使用 nohupscreen 保持进程运行:
    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 任务计划程序)进一步提高稳定性,并通过日志和监控确保脚本长期可靠运行。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷爱码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值