python 定时清理日志(schedule)
一、背景
在工作中我发现日志累积太多,翻阅不方便,遂写一个清理日志的定时。
本来是打算用Linux的crontab去操作的,但是在使用crontab -e的时候发现里面有任务在执行,且不知道来源何处。
于是就用python的while True去执行,如果不需要使用就用kill杀死。
二、代码
我的文件命名啥的可能不太规范
-
clean_log.py
# -*- coding: utf-8 -*-
import datetime
import os
import shutil
from datetime import datetime, timedeltadef check_file_size_not0(file_path): # 这里判断文件大小是否为空和小于50MB-看自己需求增删吧file_size = os.path.getsize(file_path)if file_size > 0 and file_size < 500 * 1024 * 1024:return Trueelse:return Falsedef is_folder_empty(folder): # 判断文件夹是否是空的return not os.listdir(folder)def delete_empty_folder(folder): # 如果文件夹是空的就删除掉if is_folder_empty(folder):os.rmdir(folder)class Cleaner:def clean_logs(self, log_dir, days_to_keep):# 计算保留日志的天数前的日期threshold = datetime.now() - timedelta(days=days_to_keep)# 遍历目录下的所有文件和文件夹for filename in os.listdir(log_dir):file_path = os.path.join(log_dir, filename)if os.path.isfile(file_path): # 如果这个路径是文件# 尝试从文件名中提取日期(这里假设文件名包含日期)try:date_str = filename.split('_')[1].split('.')[0]file_date = datetime.strptime(date_str, '%Y-%m-%d')if file_date < threshold:os.remove(file_path)except ValueError:# 如果文件名不符合预期格式,则跳过continuedelete_empty_folder(log_dir) # 空文件夹则删掉def backup_logs(self, log_dir, backup_dir, log_file_name):# 创建一个以当前日期命名的备份目录today = datetime.today().strftime('%Y-%m-%d-%H:%M:%S') # 我用的数据准确到时分秒backup_path = os.path.join(backup_dir, today)need_file = []log_file = os.path.join(log_dir, log_file_name)if os.path.exists(log_file):if check_file_size_not0(log_file):need_file.append(log_file)else:print(f"{log_file} 日志文件为空或者小于50MB。")else:print(f"{log_file}日志文件不存在。")if need_file: # 如果有日志需要备份才会去创建文件夹os.makedirs(backup_path, exist_ok=True)for n in need_file:# 复制日志文件到备份目录new_file = f'bk_{today}_{log_file_name}' #新的文件名to_file = os.path.join(backup_path, new_file) # 目标文件路径shutil.copy(n, to_file)# 清空原日志文件内容-我需要清空,不希望一个文件累积太大with open(n, 'w') as file:file.truncate() # 或者简单地不写入任何内容,打开文件并立即关闭也会清空文件
-
main.py
不使用start去定时,该文件可单独执行
from clean_log import Cleanerdef main_run():# 清理日志用的,写个定时更方便:在start那里,main可以单独执行cl = Cleaner()# 路径log_dir = '文件夹的绝对路径'backup_dir = '备份日志文件夹的绝对路径'log_file_name = '日志名字,例如XXX.out等' # 我实际写的循环去处理多个日志,看个人需求吧cl.backup_logs(log_dir, backup_dir, log_file_name) # 备份日志-路径log_dir = backup_dir # 需要清除日志的路径,即备份日志文件夹的路径days_to_keep = 30 # 保留30天内的日志cl.clean_logs(log_dir, days_to_keep) # 清除日志if __name__ == "__main__":main_run() # 运行
-
start.py
import datetime
import timeimport schedulefrom main import main_run# 写任务函数,用于执行定时任务的具体操作
def run_task():print(f"Running task main_run at {datetime.datetime.now()}")main_run() # main.main_run() -> clean_logschedule.every().day.at("03:00").do(run_task) # 每天凌晨3点执行任务
while True:schedule.run_pending()time.sleep(1)
schedule需要安装 pip3 install schedule即可
三、运行
命令行运行: