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

四、Python日志系统之日志文件的备份和删除

import os
import datetime
import logging
from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer
"""实现代码中处理日志文件的备份和删除"""
class UserLog:def __init__(self):self.logger = logging.getLogger(__name__)self.logger.handlers = []  # 清空 handlers,防止重复添加self.logger.setLevel(logging.DEBUG)  # 测试环境# 创建日志文件夹base_dir = os.path.dirname(os.path.abspath(__file__))log_dir = os.path.join(base_dir, "logs")if not os.path.exists(log_dir):os.makedirs(log_dir)# 日志文件名log_file = datetime.datetime.now().strftime("%Y-%m-%d") + ".log"self.log_name = os.path.join(log_dir, log_file)# 文件输出日志self.file_handle = logging.handlers.RotatingFileHandler(self.log_name, maxBytes=10000, backupCount=5)self.file_handle.setLevel(logging.ERROR)# 日志格式formatter = logging.Formatter('%(asctime)s %(filename)s --> %(funcName)s %(levelno)s: %(levelname)s -----> %(message)s')self.file_handle.setFormatter(formatter)self.logger.addHandler(self.file_handle)# 启动日志文件变化监控self.start_file_monitor()def start_file_monitor(self):observer = Observer()observer.schedule(LogFileHandler(self.log_name), os.path.dirname(self.log_name))observer.start()print(f"Started monitoring {self.log_name} for changes...")def get_log(self):return self.loggerdef close_handle(self):self.logger.removeHandler(self.file_handle)self.file_handle.close()def handle_backup_and_deletion(self):"""处理日志文件的备份和删除"""log_files = [f for f in os.listdir(os.path.dirname(self.log_name)) if f.endswith(".log")]# 获取当前日志文件夹中所有以.log 结尾的文件列表log_files.sort()# 对获取到的日志文件列表按文件名进行排序,确保处理顺序# 备份超过指定数量的旧日志文件if len(log_files) > self.file_handle.backupCount:# 如果当前日志文件数量超过设置的备份数量for file_to_backup in log_files[:len(log_files) - self.file_handle.backupCount]:# 对于超出备份数量的旧文件进行处理backup_path = os.path.join(os.path.dirname(self.log_name), f"backup_{file_to_backup}")# 确定备份文件的路径,文件名前面添加"backup_"os.rename(os.path.join(os.path.dirname(self.log_name), file_to_backup), backup_path)# 将旧文件重命名为备份文件# 删除备份时间过长的日志文件(示例:超过 7 天)current_time = datetime.datetime.now()# 获取当前时间for backup_file in os.listdir(os.path.dirname(self.log_name)):# 遍历文件夹中的所有文件if backup_file.startswith("backup_") and (current_time - datetime.datetime.fromtimestamp(os.path.getmtime(os.path.join(os.path.dirname(self.log_name), backup_file)))) > datetime.timedelta(days=7):# 如果文件以"backup_"开头,并且其修改时间超过 7 天os.remove(os.path.join(os.path.dirname(self.log_name), backup_file))# 删除该备份文件class LogFileHandler(FileSystemEventHandler):def __init__(self, log_file):self.log_file = log_fileself.error_lines = set()  # 用于存储已经打印过的包含"ERROR"的行def on_modified(self, event):if event.src_path == self.log_file and event.event_type == 'odified':with open(self.log_file, 'r') as f:lines = f.readlines()for line in lines:if "ERROR" in line and line not in self.error_lines:  # 检查是否已经打印过print(f"Error found in log: {line.strip()}")self.error_lines.add(line)  # 将该行添加到已打印集合

在上述代码中,添加了 handle_backup_and_deletion 方法来处理日志文件的备份和删除。
对于备份,当当前的日志文件数量超过 RotatingFileHandler 中设置的 backupCount 时,将最早的日志文件进行备份。
对于删除,这里示例为删除超过 7 天的备份日志文件,可以根据实际需求调整时间阈值和删除条件。

首先,通过 os.listdir 获取日志文件夹中的所有 .log 文件,并对其进行排序。
然后,检查文件数量是否超过设置的备份数量。如果超过,就从最早的文件开始进行备份,通过重命名的方式将其转换为备份文件。
接下来,获取当前时间,并再次遍历文件夹中的文件。对于以 backup_ 开头且修改时间超过 7 天的备份文件,使用 os.remove 进行删除,以释放存储空间并保持备份的整洁。

相关文章:

四、Python日志系统之日志文件的备份和删除

import os import datetime import logging from watchdog.events import FileSystemEventHandler from watchdog.observers import Observer """实现代码中处理日志文件的备份和删除""" class UserLog:def __init__(self):self.logger logging…...

Android Camera Framework:从基础到高级

目录 基础知识1. Camera API 与 Camera2 API2. 权限 关键组件1. CameraManager2. CameraDevice3. CaptureRequest 和 CaptureSession 高级功能1. 实时滤镜2. 手动控制3. 高动态范围 (HDR) 和夜间模式 在现代移动应用开发中,相机功能已成为许多应用程序的核心组成部分…...

面向 Rust 新手的 Cargo 教程:轻松上手

面向 Rust 新手的 Cargo 教程:轻松上手 引言Cargo 简介定义与重要性与传统构建工具的对比 安装与配置 Cargo在不同操作系统上安装 Rust 和 CargoWindowsmacOSLinux 配置 Cargo 环境变量与路径第一个 Cargo 项目 主要功能概述结语 引言 在编程语言的浩瀚宇宙中&…...

MSPM0G3507——时钟配置(与32关系)

先将32端时钟配置分为1,2,3如图 1是PSC左边未经分频的时钟源(HZ) 2是经过PSC分频的时钟信号(HZ) 3是最终的输出信号(HZ) 3输出的是一个定时器周期的HZ,可以转换成时间 …...

Linux 创建新虚拟机的全过程图解

一、创建新虚拟机 1.选择自定义 2.直接下一步 3.选择稍后安装 4.设置虚拟机名和安装位置 5.配置处理器(处理器数量:4、每个处理器的内核:2) 6. 内存选择 7.网络类型 8. IO控制器类型-默认推荐 9.磁盘类型-默认推荐 10.选择虚拟磁…...

【已解决】腾讯云安装了redis,但是本地访问不到,连接不上

汇总了我踩过的所有问题。 查看配置文件redis.conf 1、把bind 127.0.0.1给注释掉(前面加个#就是)或者改成bind 0.0.0.0,因为刚下载时它是默认只让本地访问。(linux查找文档里的内容可以输入/后面加需要匹配的内容,然后…...

python批量去除图片文字水印

#!/usr/bin/env python # -*- coding:utf-8 -*- # 需要安装的库 # pip install paddlepaddle -i https://mirrors.aliyun.com/pypi/simple/ # pip install paddleocr -i https://mirrors.aliyun.com/pypi/simple/ # pip install cv2 -i https://mirrors.aliyun.com/pypi/simple…...

C++ Qt 自制开源科学计算器

C Qt 自制开源科学计算器 项目地址 软件下载地址 目录 0. 效果预览1. 数据库准备2. 按键&快捷键说明3. 颜色切换功能(初版)4. 未来开发展望5. 联系邮箱 0. 效果预览 普通计算模式效果如下: 科学计算模式效果如下: 更具体的功能演示视频见如下链接…...

相机光学(二十八)——感光度(ISO)

感光度又称为ISO,是指相机对光线的敏感程度。ISO值越大,感光度越高,拍出来的照片就会越亮,反之就会越暗。但是ISO过高会使照片噪点也随之变高。感光度,又称为ISO值,是衡量底片对于光的灵敏程度,…...

基于全国产复旦微JFM7K325T+ARM人工智能数据处理平台

复旦微可以配合的ARM平台有:RK3588/TI AM62X/ NXP IMX.8P/飞腾FT2000等。 产品概述 基于PCIE总线架构的高性能数据预处理FMC载板,板卡采用复旦微的JFM7K325T FPGA作为实时处理器,实现各个接口之间的互联。该板卡可以实现100%国产化。 板卡具…...

HarmonyOS Next应用开发之系统概述

一、鸿蒙系统概述 鸿蒙系统可以分为华为鸿蒙系统(HUAWEI HarmonyOS)和开源鸿蒙系统(OpenHarmony),华为鸿蒙系统是基于OpenHarmony基础之上开发的商业版操作系统。他们二者的关系可以用下图来表示: 1.1、…...

RedHat运维-Linux SSH基础2-基于公钥认证

1. 要想配置基于公钥认证的SSH连接,而不是基于密码认证的SSH连接,只需要将自己的公钥传送给对方即可,假如公钥是~/.ssh/id_rsa.pub,对方是centos192.168.197.128,则命令是____________________________________&#x…...

机器学习模型运用在机器人上

机器学习模型在机器人技术中的应用非常广泛,涵盖了从简单的运动控制到复杂的认知和交互功能。以下是几种机器学习模型在机器人上的典型应用: 感知与识别: 计算机视觉:使用卷积神经网络(CNNs)识别和理解视觉…...

振弦采集仪在大型工程安全监测中的作用与意义

振弦采集仪在大型工程安全监测中的作用与意义 河北稳控科技振弦采集仪是一种用于测量振动频率的仪器,常用于大型工程的安全监测中。它通过采集振弦的振动信号,可以对工程结构的振动特性进行实时监测和分析。振弦采集仪在大型工程安全监测中具有重要的作…...

CVE-2024-36991:Splunk Enterprise任意文件读取漏洞复现 [附POC]

文章目录 CVE-2024-36991:Splunk Enterprise任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议CVE-2024-36991:Splunk Enterprise任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明:…...

Python的utils库详解

Python的utils库并不是一个官方标准库,而是指一系列提供实用功能的工具库或模块,这些库或模块通常包含了一系列帮助开发人员加速日常工作、提高开发效率的工具函数或类。由于Python社区的开放性和活跃性,存在多个不同的utils库,每…...

基于 Qt、FFmpeg 和 OpenGL 开发跨平台安卓实时投屏软件 QtScrcpy

文章目录 基于 Qt、FFmpeg 和 OpenGL 开发跨平台安卓实时投屏软件 QtScrcpy项目详细介绍1. 项目背景2. 功能特点3. 关键代码解读1. 引入必要的头文件和初始化函数2. VideoWidget 类的定义3. OpenGL 初始化和绘制函数4. 视频解码和渲染线程5. 主函数示例结语基于 Qt、FFmpeg 和 …...

LabVIEW光谱测试系统

在现代光通信系统中,光谱分析是不可或缺的工具。开发了一种基于LabVIEW的高分辨率光谱测试系统,通过对可调谐激光器、可编程光滤波器和数据采集系统的控制,实现了高效、高精度的光谱测量。 项目背景 随着光通信技术的迅速发展,对…...

SpringBoot使用@RestController处理GET和POST请求

在Spring MVC中,RestController注解的控制器类可以处理多种HTTP请求方法,包括GET和POST。这些请求方法通过特定的注解来映射,比如GetMapping用于GET请求,PostMapping用于POST请求。这些注解是RequestMapping的特定化版本&#xff…...

Kudu分区策略

Kudu表的分区策略主要有三种:范围分区(Partition By Range)、哈希分区(Partition By Hash)和高级分区(Partition By Hash And Range)。这些策略都要求分区字段必须包含在主键中。 范围分区&…...

【位运算】消失的两个数字(hard)

消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...