一、背景
在工作中我发现日志累积太多,翻阅不方便,遂写一个清理日志的定时。
本来是打算用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即可
三、运行
命令行运行: