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

Python 日志记录器logging 百科全书 之 日志回滚

在这里插入图片描述

Python 日志记录器logging 百科全书 之 日志回滚

前言

在之前的文章中,我们学习了关于Python日志记录的基础配置

本文将深入探讨Python中的日志回滚机制,这是一种高效管理日志文件的方法,特别适用于长时间运行或高流量的应用。

知识点📖📖

模块释义
loggingPython 的日志记录工具,标准库
RotatingFileHandler基于文件大小进行日志回滚的处理器。
TimedRotatingFileHandler基于时间间隔进行日志回滚的处理器。

导入模块

import logging
from logging.handlers import (RotatingFileHandler, TimedRotatingFileHandler)

文章脉络:

  • 点击直达:万字长文 - Python 日志记录器logging 百科全书 之 基础配置
  • 点击直达:Python 日志记录器logging 百科全书 之 日志回滚

日志回滚

Python中,日志回滚通常通过logging.handlers模块中的RotatingFileHandlerTimedRotatingFileHandler实现。

  • RotatingFileHandler: 当日志文件达到指定大小时,自动“回滚”日志文件,即创建一个新的日志文件,并将旧文件保留为备份。
  • RotatingFileHandler: 根据时间间隔回滚日志文件,可以是每秒、每分钟、每小时或每天等。

概念

通过灵活地使用Logger和多个Handler,可以构建一个强大而灵活的日志系统,它可以同时满足日志记录的多样化需求,如日志的级别、格式、输出目的地等,从而为应用程序的监控和故障排查提供强有力的支持。

Logger(日志记录器)

  • Logger是日志系统的入口。应用程序通过Logger实例来记录日志。
  • 功能:Logger负责捕获日志消息并将它们分发给所有附加的Handler。
  • 日志级别:Logger可以设置日志级别,以决定要处理哪些级别的日志消息。

Handler(日志处理器)

  • Handler负责将日志消息发送到指定的目的地,这个目的地可以是文件、控制台、网络等。
  • 类型:包括但不限于StreamHandler(控制台输出)、FileHandler(写入文件)、RotatingFileHandler(基于文件大小回滚的文件写入)、TimedRotatingFileHandler(基于时间间隔回滚的文件写入)等。
  • 独立配置:每个Handler可以有自己的日志级别和格式设置(通过Formatter)。这允许不同的Handler以不同的方式处理相同的日志消息。

多处理器配置

  • 灵活性:一个Logger可以附加多个Handler,每个Handler可以独立配置,增加了日志系统的灵活性和可定制性。
  • 举例:例如配置一个Logger,使其同时将日志消息输出到控制台(使用StreamHandler)和文件(使用FileHandlerRotatingFileHandler)。
  • 级别和格式的多样性:不同的Handler可以设置不同的日志级别和格式。例如对于调试目的,在控制台上输出所有级别的日志,而在文件中只记录警告或更高级别的日志。

步骤

值得注意的是,这里的设置日志级别和日志格式,与前文的basicConfig是不一样滴~,细看下文!!!

设置日志回滚的步骤如下:

  1. 创建日志记录器(Logger):实例化一个日志记录器,为日志消息提供一个捕获和分发的入口点;
  2. 创建日志格式(Formatter):创建一个Formatter对象,指定日志消息的格式;
  3. 实例化日志处理器(Handler):根据需要选择适当的处理器,例如FileHandlerRotatingFileHandler等;
  4. 添加处理器(Handler)到记录器(Logger):最后,将这些处理器添加到日志记录器(Logger);
  5. 记录日志:使用配置好的日志记录器来记录消息
  6. (可选)清理旧日志文件

1. 创建日志记录器(Logger)

  • 实例化一个日志记录器,为日志消息提供一个捕获和分发的入口点。
  • 命名可随意,如不传入,默认返回 root logger
logger = logging.getLogger(name="my_application_logger")
logger.setLevel(logging.INFO)

2. 创建日志格式(Formatter)

  • 创建一个Formatter对象,定义日志消息的输出格式。这可以包括时间戳、日志级别、消息等。
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

3. 实例化日志处理器(Handler)

根据需要选择适当的处理器,

对于基于文件大小的回滚

  • 创建一个RotatingFileHandler,设置最大文件大小和备份文件数量。
rotating_handler = RotatingFileHandler("my_log.log", maxBytes=1024*1024, backupCount=5)
rotating_handler.setFormatter(formatter)

对于基于时间的回滚

  • 创建一个TimedRotatingFileHandler,设置回滚时间(如午夜)、间隔和备份文件数量。
timed_handler = TimedRotatingFileHandler("my_log.log", when="midnight", interval=1, backupCount=7)
timed_handler.setFormatter(formatter)

4. 添加处理器(Handler)到记录器(Logger)

  • 将配置好的处理器添加到日志记录器。这使得日志消息可以按照处理器的配置被处理和输出。
  • 同时添加多个日志处理器 也没任何问题~
logger.addHandler(rotating_handler)
logger.addHandler(timed_handler)

5. 记录日志

  • 使用配置好的日志记录器来记录消息。根据记录器和处理器的配置,日志消息将按照指定的方式被处理和存储。
logger.info("This is a test log message.")

6. (可选) 清理旧日志文件

  • 定期清理旧的日志文件是维护日志系统的一部分。可以编写脚本或使用工具来自动删除过时的日志文件,以释放磁盘空间。
import os
import glob
import timelog_dir = '/logs'
# 查找目录中所有扩展名为.log的文件
log_files = glob.glob(os.path.join(log_dir, '*.log'))for log_file in log_files:# 检查文件的最后修改日期# 判断文件的最后修改时间是否早于当前时间7天(7 * 24 * 3600秒)if os.path.getmtime(log_file) < (time.time() - 7 * 24 * 3600):os.remove(log_file)

RotatingFileHandler

RotatingFileHandler是用于基于文件大小的日志回滚。当日志文件达到指定大小时,它会自动 回滚 日志文件。

主要参数

  1. filename:日志文件的名称。
  2. mode:文件的打开模式。默认是 'a',表示追加模式。其他常见模式包括 'w'(写模式,每次启动时覆盖文件)。
  3. maxBytes:日志文件的最大字节数。当文件大小超过这个值时,会创建一个新文件。如app.log.1, app.log.2
  4. backupCount:保留的备份文件数量。比如,如果设置为5,则除了原始日志文件外,还会有5个备份文件。
  5. encoding(可选):文件的编码方式,同basicConfig
  6. delay(可选):如果设置为True,则直到第一次调用emit()方法时才会创建文件。即直到日志系统实际写入消息时才创建文件,避免创建空日志文件
  7. errors:指定如何处理编码错误,同basicConfig

示例代码

import logging
from logging.handlers import RotatingFileHandler# 创建日志记录器,设置日志级别为INFO
logger = logging.getLogger("my_app_logger")
logger.setLevel(logging.INFO)# 创建 RotatingFileHandler
# 设置文件最大大小为1MB,最多保留3个备份
handler = RotatingFileHandler("./logs/app.log", maxBytes=1024*1024, backupCount=3)
handler.setLevel(logging.INFO)# 创建日志格式并设置给处理器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)# 将处理器添加到日志记录器
logger.addHandler(handler)# 记录一些示例日志
for i in range(1000):logger.info(f"This is log message {i}")

TimedRotatingFileHandler

TimedRotatingFileHandler用于基于时间的日志回滚。根据指定的时间间隔回滚日志文件。

主要参数

  1. filename:日志文件的名称。
  2. when:时间间隔的类型。常见值有'S'(秒),'M'(分钟),'H'(小时),'D'(天),'W0'-'W6'(周一至周日),'midnight'(每天午夜)。
  3. interval:回滚之间的时间间隔。与when参数一起使用。例如,when='H'interval=6表示每6小时回滚一次日志文件。
  4. backupCount:保留的备份文件数量。比如,如果设置为5,则除了原始日志文件外,还会有5个备份文件。
  5. encoding(可选):文件的编码方式,同basicConfig
  6. delay(可选):如果设置为True,则直到第一次调用emit()方法时才会创建文件。即直到日志系统实际写入消息时才创建文件,避免创建空日志文件
  7. utc:如果设置为True,则时间间隔的计算基于UTC时间。默认为False,基于本地时间。
  8. atTime(可选):如果when设置为'midnight',这个参数可以用来指定回滚发生的具体时间。
  9. errors:指定如何处理编码错误,同basicConfig

示例代码

import logging
from logging.handlers import TimedRotatingFileHandler# 创建日志记录器,设置日志级别为INFO
logger = logging.getLogger("my_app_logger")
logger.setLevel(logging.INFO)# 创建 TimedRotatingFileHandler
# 设置每天午夜回滚一次日志,保留最多7个备份
handler = TimedRotatingFileHandler("./logs/app.log", when="midnight", interval=1, backupCount=7)
handler.setLevel(logging.INFO)# 创建日志格式并设置给处理器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)# 将处理器添加到日志记录器
logger.addHandler(handler)# 记录一些示例日志
for i in range(1000):logger.info(f"This is log message {i}")

应用场景

日志处理器应用场景优势
RotatingFileHandler- 日志活动频繁但数据量可预测的环境
- 控制日志文件大小,避免单个文件过大
- 防止日志文件过大,便于文件传输和查看
- 适合稳定的日志输出环境
TimedRotatingFileHandler- 需要按时间周期归档日志的情况
- 定期审查或归档日志,如审计和系统监控
- 根据时间自动组织日志文件
- 便于日志的定期查找和分析

总结🐓🐓

本文详细探讨了Python中的日志回滚机制,包括RotatingFileHandlerTimedRotatingFileHandler两种关键的日志处理器。这些处理器不仅增强了日志系统的灵活性,还大大简化了日志管理,特别适用于长时间运行或高流量的应用。

日志回滚是一种高效的日志管理技术,能够自动控制日志文件的大小和生命周期。通过正确使用RotatingFileHandlerTimedRotatingFileHandler,我们可以为应用程序提供稳定、可靠的日志记录机制,保障应用程序的健康运行。

后话

本次分享到此结束,

see you~🐱‍🏍🐱‍🏍

相关文章:

Python 日志记录器logging 百科全书 之 日志回滚

Python 日志记录器logging 百科全书 之 日志回滚 前言 在之前的文章中&#xff0c;我们学习了关于Python日志记录的基础配置。 本文将深入探讨Python中的日志回滚机制&#xff0c;这是一种高效管理日志文件的方法&#xff0c;特别适用于长时间运行或高流量的应用。 知识点&…...

线圈寿命预测 数据集讲解

来自-郭师兄 1.这个是线圈数据的阻抗、电抗等数据&#xff0c;我想根据这个个数据进行线圈寿命预测也就是RUL预测&#xff0c;请问有什么思路吗。 最简单的思路&#xff1a; 数据通过某种方法进行压缩表征到一维再通过 同时需要标签。 确定一个特征 使用降维方法如同PCA来构…...

Flutter.源码分析.flutter/packages/flutter/lib/src/widgets/scroll_view.dart/GridView

Flutter.源码分析 GridView flutter/packages/flutter/lib/src/widgets/scroll_view.dart/GridView 李俊才 的个人博客&#xff1a;https://blog.csdn.net/qq_28550263 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134375048 本文提供 Flutter 框…...

IDEA 2022创建Spring Boot项目

首先点击New Project 接下来&#xff1a; (1). 我们点击Spring Initializr来创建。 (2). 填写项目名称 (3). 选择路径 (4). 选择JDK------这里笔者选用jdk17。 (5). java选择对应版本即可。 (6). 其余选项如无特殊需求保持默认即可。 然后点击Next。 稍等一会&#xff0c…...

Python 框架学习 Django篇 (十) Redis 缓存

开发服务器系统的时候&#xff0c;程序的性能是至关重要的。经过我们前面框架的学习&#xff0c;得知一个请求的处理基本分为接受http请求、数据库处理、返回json数据&#xff0c;而这3个部分中就属链接数据库请求的响应速度最慢&#xff0c;因为数据库操作涉及到数据库服务处理…...

考研数学笔记:线性代数中抽象矩阵性质汇总

在考研线性代数这门课中&#xff0c;对抽象矩阵&#xff08;矩阵 A A A 和矩阵 B B B 这样的矩阵&#xff09;的考察几乎贯穿始终&#xff0c;涉及了很多性质、运算规律等内容&#xff0c;在这篇考研数学笔记中&#xff0c;我们汇总了几乎所有考研数学要用到的抽象矩阵的性质…...

C语言--假设共有鸡、兔30只,脚90只,求鸡、兔各有多少只​

一.题目描述 假设共有鸡、兔30只&#xff0c;脚90只&#xff0c;求鸡、兔各有多少只&#xff1f; 二.思路分析 本题是一个典型的穷举法例题&#xff0c;而穷举法&#xff0c;最重要的就是条件判断。⭐⭐ 本题中的条件很容易发现&#xff1a; 假设鸡有x只&#xff0c;兔有y只…...

nacos适配达梦数据库

一、下载源码 源码我直接下载gitee上nacos2.2.3的&#xff0c;具体链接&#xff1a;https://gitee.com/mirrors/Nacos/tree/2.2.3&#xff0c;具体如下图&#xff1a; 二、集成达梦数据库驱动 解压源码包&#xff0c;用idea打开源码&#xff0c;等idea和maven编译完成&#xff…...

CTFhub-RCE-读取源代码

源代码&#xff1a; <?php error_reporting(E_ALL); if (isset($_GET[file])) { if ( substr($_GET["file"], 0, 6) "php://" ) { include($_GET["file"]); } else { echo "Hacker!!!"; } } else {…...

Ansible playbook详解

playbook是ansible用于配置&#xff0c;部署&#xff0c;和被管理被控节点的剧本 playbook常用的YMAL格式&#xff1a;&#xff08;文件名称以 .yml结尾&#xff09; 1、文件的第一行应该以 "---" (三个连字符)开始&#xff0c;表明YMAL文件的开始。    2、在同一…...

Linux编辑器:vim的简单介绍及使用

目录 1.什么是vim 2.vim的基本概念 3.vim 的基本操作 4. 各模式下的命令集 4.1 正常模式命令集 4.2 末行模式命令集 5.补充 5.1 vim支持多文件编辑 5.2 vim 的配置 1.vim 配置原理 2. 常用简单配置选项&#xff1a; 3. 使用插件 1.什么是vim Vim 是从 vi 发展出…...

Redhat7查看时区、修改时区

问题&#xff1a; 安装好redhat7之后&#xff0c;发现时间和物理机上面的网络时间不一致&#xff0c;于是查看本着修改时间的目的&#xff0c;却发现原来是时区的问题。 解决步骤&#xff1a; 查看时区状态信息 timedatectl修改时区到亚洲/上海 timedatectl set-timezone A…...

OpenCV踩坑笔记使用笔记入门笔记整合SpringBoot笔记大全

springboot开启摄像头抓拍照片并上传实现&问题记录 NotAllowedErrot: 请求的媒体源不能使用&#xff0c;以下情况会返回该错误: 当前页面内容不安全&#xff0c;没有使用HTTPS没有通过用户授权NotFoundError: 没有找到指定的媒体通道NoReadableError: 访问硬件设备出错Ov…...

【数据结构】栈和队列的模拟实现(两个方式实现)

前言 &#x1f493;作者简介&#xff1a; 加油&#xff0c;旭杏&#xff0c;目前大二&#xff0c;正在学习C&#xff0c;数据结构等&#x1f440; &#x1f493;作者主页&#xff1a;加油&#xff0c;旭杏的主页&#x1f440; ⏩本文收录在&#xff1a;再识C进阶的专栏&#x1…...

OpenCV+相机校准和3D重建

相机校准至少需要10个测试图案&#xff0c;所需的重要输入数据是3D现实世界点集以及图像中这些点的相应2D坐标。3D点称为对象点&#xff0c;而2D图像点称为图像点。 准备工作 除了棋盘&#xff0c;我们还可以使用圆形网格。 在这种情况下&#xff0c;我们必须使用函数cv.find…...

2023.11.14-hive之表操作练习和文件导入练习

目录 需求1.数据库基本操作 需求2. 默认分隔符案例 需求1.数据库基本操作 -- 1.创建数据库test_sql,cs1,cs2,cs3 create database test_sql; create database cs1; create database cs2; create database cs3; -- 2.1删除数据库cs2 drop database cs2; -- 2.2在cs3库中创建…...

idea2023启动springboot项目如何指定配置文件

方法一&#xff1a; 方法二&#xff1a; 举例&#xff1a;...

在 uniapp 中 一键转换单位 (px 转 rpx)

在 uniapp 中 一键转换单位 px 转 rpx Uni-app 官方转换位置利用【px2rpx】插件Ctrl S一键全部转换下载插件修改插件 Uni-app 官方转换位置 首先在App.vue中输入这个&#xff1a; uni.getSystemInfo({success(res) {console.log("屏幕宽度", res.screenWidth) //屏…...

SQL对数据进行去重

工作中使用SQL对数据进行处理计算时可能会遇到这样的问题&#xff1b;读取的表数据会有重复&#xff0c;或者我们关注的几个字段的数据会有重复&#xff0c;直接使用原表数据会引起计算结果不准或者做表连接时产生笛卡尔积。 本文记录使用SQL进行数据去重的几种算法。 distinc…...

登录注册代码模板(Vue3+SpringBoot)[邮箱发送验证码(HTML)、RSA 加密解密(支持长文本)、黑暗与亮色主题切换、AOP信息校验]

文章归档&#xff1a;https://www.yuque.com/u27599042/coding_star/cx5ptule64utcr9e 仓库地址 https://gitee.com/tongchaowei/login-register-template 网页效果展示 相关说明 在该代码模板中&#xff0c;实现了如下功能&#xff1a; 邮箱发送验证码&#xff08;邮件内容…...

STM32智能垃圾桶开发实战:语音识别与自动分类

1. 项目概述这个智能垃圾桶项目是我去年为一个社区环保活动设计的硬件方案。当时社区正在推广垃圾分类&#xff0c;但居民反映传统分类垃圾桶使用不便&#xff0c;经常出现错投混投的情况。于是我就琢磨着用STM32做个能听懂人话、自动开盖的智能垃圾桶&#xff0c;让垃圾分类变…...

**发散创新:基于Go语言的事件驱动式应急响应架构设计与实践**在现代云原生和微服务架构中,**快速、精准的事件

发散创新&#xff1a;基于Go语言的事件驱动式应急响应架构设计与实践 在现代云原生和微服务架构中&#xff0c;快速、精准的事件响应能力已成为系统稳定性的核心保障。传统的轮询式监控和静态规则告警已难以应对复杂多变的生产环境。本文将带你深入探索一种以 Go语言为核心 的轻…...

3大云平台统一监控:Telegraf多厂商集成实战指南

3大云平台统一监控&#xff1a;Telegraf多厂商集成实战指南 在当今多云架构盛行的时代&#xff0c;企业往往同时使用AWS、Azure和Google Cloud等多个云平台&#xff0c;这使得跨平台的监控变得复杂而棘手。Telegraf作为一款插件驱动的服务器代理&#xff0c;专为收集和报告指标…...

操作系统与数据库系统的核心知识点,属于计算机科学与技术专业(尤其是考研408统考或相关课程)的重点复习提纲

操作系统与数据库系统的核心知识点&#xff0c;属于计算机科学与技术专业&#xff08;尤其是考研408统考或相关课程&#xff09;的重点复习提纲。以下是对各部分的简明梳理与关键点说明&#xff1a; ✅ 死锁处理 预防&#xff1a;破坏死锁四个必要条件之一&#xff08;互斥、占…...

自动化抢票工具:从技术原理到实战部署的全流程解析

自动化抢票工具&#xff1a;从技术原理到实战部署的全流程解析 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 在票务销售场景中&#xff0c;人工操作面临三大核心痛点&#xff1a;页面刷新延迟导…...

Pixel Epic在MBA教学中的应用:学生用像素界面完成商业计划书作业案例

Pixel Epic在MBA教学中的应用&#xff1a;学生用像素界面完成商业计划书作业案例 1. 引言&#xff1a;当商业教育遇上像素冒险 在传统MBA教学中&#xff0c;商业计划书撰写往往是让学生头疼的作业任务。学生们需要花费大量时间收集数据、分析市场、构建财务模型&#xff0c;最…...

3大优势让学术翻译更安全:Zotero PDF翻译插件离线方案全解析

3大优势让学术翻译更安全&#xff1a;Zotero PDF翻译插件离线方案全解析 【免费下载链接】zotero-pdf-translate Translate PDF, EPub, webpage, metadata, annotations, notes to the target language. Support 20 translate services. 项目地址: https://gitcode.com/gh_mi…...

新手福音:用快马生成centos8下载安装全流程可视化引导工具

今天想和大家分享一个特别适合Linux新手的实用工具——用InsCode(快马)平台快速生成CentOS 8下载安装引导程序。作为一个从Windows转Linux的过来人&#xff0c;我深知第一次面对系统安装时的茫然&#xff0c;这个工具能帮你把复杂流程变成可视化指引。 为什么需要这个工具 刚接…...

企微私域工具数据安全与合规:5个必查项

某公司用了半年企微私域工具&#xff0c;突然发现客户手机号被工具厂商用来发营销短信。法务一查&#xff0c;原来是协议里写了“数据可用于优化产品”。选【企微私域工具】&#xff0c;数据安全比功能更重要。今天列出5个必须检查的安全合规点。企微工具选择要把安全放第一位&…...

新手零基础入门:用快马AI生成你的第一个互联网个人主页

作为一个刚接触编程的新手&#xff0c;想要制作个人主页却不知从何下手是很常见的情况。最近我在InsCode(快马)平台上尝试用AI生成我的第一个网页&#xff0c;整个过程比想象中简单很多&#xff0c;特别适合零基础入门。下面分享我的学习过程和收获。 明确需求很关键 在开始前&…...