一、背景

在工作中我发现日志累积太多,翻阅不方便,遂写一个清理日志的定时。

本来是打算用Linux的crontab去操作的,但是在使用crontab -e的时候发现里面有任务在执行,且不知道来源何处。

于是就用python的while True去执行,如果不需要使用就用kill杀死。

二、代码

我的文件命名啥的可能不太规范

  • clean_log.py

# -*- coding: utf-8 -*-
import datetime
import os
import shutil
from datetime import datetime, timedelta


def 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 True
    else:
        return False


def 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:
                    # 如果文件名不符合预期格式,则跳过
                    continue
        delete_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 Cleaner


def 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 time

import schedule

from main import main_run


# 写任务函数,用于执行定时任务的具体操作
def run_task():
    print(f"Running task main_run at {datetime.datetime.now()}")
    main_run()  # main.main_run() -> clean_log

schedule.every().day.at("03:00").do(run_task) # 每天凌晨3点执行任务
while True:
    schedule.run_pending()
    time.sleep(1)
schedule需要安装 pip3 install schedule即可

三、运行

命令行运行:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐