当前位置: 首页 > news >正文

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即可

三、运行

命令行运行:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024实验班选拔考试(热身赛)
  • Windows10上安装SQL Server 2022 Express
  • MySQL的安装数据库的简单操作
  • 力扣——11.盛最多水的容器
  • 基于STM32设计的盆栽种植自动管理系统(微信小程序)(201)
  • Milvus Cloud架构详解:构建高效、可扩展的向量数据库系统
  • 分布式时序数据库TimeLyre 9.2发布:原生多模态、高性能计算、极速时序回放分析
  • C++的STL简介(四)
  • React 常用 Hooks 和使用的易错点
  • gradio在windows上公网发布踩坑指南
  • PHP高校教材管理系统-计算机毕业设计源码29810
  • 大语言模型系列 - Transformer
  • 去中心化社交:探讨Facebook在区块链平台上的实践
  • 【Linux】【系统纪元】Linux起源与环境安装
  • SQL注入
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 0基础学习移动端适配
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • idea + plantuml 画流程图
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • MySQL用户中的%到底包不包括localhost?
  • nfs客户端进程变D,延伸linux的lock
  • Redis在Web项目中的应用与实践
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Tornado学习笔记(1)
  • 对象引论
  • 解析带emoji和链接的聊天系统消息
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 我的业余项目总结
  • 中文输入法与React文本输入框的问题与解决方案
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • # C++之functional库用法整理
  • #14vue3生成表单并跳转到外部地址的方式
  • #define、const、typedef的差别
  • #includecmath
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)Dubbo快速入门、介绍、使用
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转) Face-Resources
  • (转载)OpenStack Hacker养成指南
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 读取 JSON格式的数据
  • .NET下的多线程编程—1-线程机制概述