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

Python 日志记录器logging 百科全书 之 日志回滚
前言
在之前的文章中,我们学习了关于Python日志记录的基础配置。
本文将深入探讨Python中的日志回滚机制,这是一种高效管理日志文件的方法,特别适用于长时间运行或高流量的应用。
知识点📖📖
| 模块 | 释义 |
|---|---|
logging | Python 的日志记录工具,标准库 |
RotatingFileHandler | 基于文件大小进行日志回滚的处理器。 |
TimedRotatingFileHandler | 基于时间间隔进行日志回滚的处理器。 |
导入模块
import logging
from logging.handlers import (RotatingFileHandler, TimedRotatingFileHandler)
文章脉络:
- 点击直达:万字长文 - Python 日志记录器logging 百科全书 之 基础配置
- 点击直达:Python 日志记录器logging 百科全书 之 日志回滚
日志回滚
在Python中,日志回滚通常通过logging.handlers模块中的RotatingFileHandler或TimedRotatingFileHandler实现。
- RotatingFileHandler: 当日志文件达到指定大小时,自动“回滚”日志文件,即创建一个新的日志文件,并将旧文件保留为备份。
- RotatingFileHandler: 根据时间间隔回滚日志文件,可以是每秒、每分钟、每小时或每天等。
概念
通过灵活地使用Logger和多个Handler,可以构建一个强大而灵活的日志系统,它可以同时满足日志记录的多样化需求,如日志的级别、格式、输出目的地等,从而为应用程序的监控和故障排查提供强有力的支持。
Logger(日志记录器)
- Logger是日志系统的入口。应用程序通过Logger实例来记录日志。
- 功能:Logger负责捕获日志消息并将它们分发给所有附加的Handler。
- 日志级别:Logger可以设置日志级别,以决定要处理哪些级别的日志消息。
Handler(日志处理器)
- Handler负责将日志消息发送到指定的目的地,这个目的地可以是文件、控制台、网络等。
- 类型:包括但不限于
StreamHandler(控制台输出)、FileHandler(写入文件)、RotatingFileHandler(基于文件大小回滚的文件写入)、TimedRotatingFileHandler(基于时间间隔回滚的文件写入)等。 - 独立配置:每个Handler可以有自己的日志级别和格式设置(通过Formatter)。这允许不同的Handler以不同的方式处理相同的日志消息。
多处理器配置
- 灵活性:一个Logger可以附加多个Handler,每个Handler可以独立配置,增加了日志系统的灵活性和可定制性。
- 举例:例如配置一个Logger,使其同时将日志消息输出到控制台(使用
StreamHandler)和文件(使用FileHandler或RotatingFileHandler)。 - 级别和格式的多样性:不同的Handler可以设置不同的日志级别和格式。例如对于调试目的,在控制台上输出所有级别的日志,而在文件中只记录警告或更高级别的日志。
步骤
值得注意的是,这里的设置日志级别和日志格式,与前文的
basicConfig是不一样滴~,细看下文!!!
设置日志回滚的步骤如下:
- 创建日志记录器(Logger):实例化一个日志记录器,为日志消息提供一个捕获和分发的入口点;
- 创建日志格式(Formatter):创建一个
Formatter对象,指定日志消息的格式; - 实例化日志处理器(Handler):根据需要选择适当的处理器,例如
FileHandler、RotatingFileHandler等; - 添加处理器(Handler)到记录器(Logger):最后,将这些处理器添加到日志记录器(Logger);
- 记录日志:使用配置好的日志记录器来记录消息
- (可选)清理旧日志文件
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是用于基于文件大小的日志回滚。当日志文件达到指定大小时,它会自动 回滚 日志文件。
主要参数:
- filename:日志文件的名称。
- mode:文件的打开模式。默认是
'a',表示追加模式。其他常见模式包括'w'(写模式,每次启动时覆盖文件)。 - maxBytes:日志文件的最大字节数。当文件大小超过这个值时,会创建一个新文件。如
app.log.1,app.log.2… - backupCount:保留的备份文件数量。比如,如果设置为5,则除了原始日志文件外,还会有5个备份文件。
- encoding(可选):文件的编码方式,同
basicConfig。 - delay(可选):如果设置为True,则直到第一次调用
emit()方法时才会创建文件。即直到日志系统实际写入消息时才创建文件,避免创建空日志文件 - 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用于基于时间的日志回滚。根据指定的时间间隔回滚日志文件。
主要参数:
- filename:日志文件的名称。
- when:时间间隔的类型。常见值有
'S'(秒),'M'(分钟),'H'(小时),'D'(天),'W0'-'W6'(周一至周日),'midnight'(每天午夜)。 - interval:回滚之间的时间间隔。与
when参数一起使用。例如,when='H'和interval=6表示每6小时回滚一次日志文件。 - backupCount:保留的备份文件数量。比如,如果设置为5,则除了原始日志文件外,还会有5个备份文件。
- encoding(可选):文件的编码方式,同
basicConfig。 - delay(可选):如果设置为True,则直到第一次调用
emit()方法时才会创建文件。即直到日志系统实际写入消息时才创建文件,避免创建空日志文件 - utc:如果设置为
True,则时间间隔的计算基于UTC时间。默认为False,基于本地时间。 - atTime(可选):如果
when设置为'midnight',这个参数可以用来指定回滚发生的具体时间。 - 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中的日志回滚机制,包括RotatingFileHandler和TimedRotatingFileHandler两种关键的日志处理器。这些处理器不仅增强了日志系统的灵活性,还大大简化了日志管理,特别适用于长时间运行或高流量的应用。
日志回滚是一种高效的日志管理技术,能够自动控制日志文件的大小和生命周期。通过正确使用RotatingFileHandler和TimedRotatingFileHandler,我们可以为应用程序提供稳定、可靠的日志记录机制,保障应用程序的健康运行。
后话
本次分享到此结束,
see you~🐱🏍🐱🏍
相关文章:
Python 日志记录器logging 百科全书 之 日志回滚
Python 日志记录器logging 百科全书 之 日志回滚 前言 在之前的文章中,我们学习了关于Python日志记录的基础配置。 本文将深入探讨Python中的日志回滚机制,这是一种高效管理日志文件的方法,特别适用于长时间运行或高流量的应用。 知识点&…...
线圈寿命预测 数据集讲解
来自-郭师兄 1.这个是线圈数据的阻抗、电抗等数据,我想根据这个个数据进行线圈寿命预测也就是RUL预测,请问有什么思路吗。 最简单的思路: 数据通过某种方法进行压缩表征到一维再通过 同时需要标签。 确定一个特征 使用降维方法如同PCA来构…...
Flutter.源码分析.flutter/packages/flutter/lib/src/widgets/scroll_view.dart/GridView
Flutter.源码分析 GridView flutter/packages/flutter/lib/src/widgets/scroll_view.dart/GridView 李俊才 的个人博客:https://blog.csdn.net/qq_28550263 本文地址:https://blog.csdn.net/qq_28550263/article/details/134375048 本文提供 Flutter 框…...
IDEA 2022创建Spring Boot项目
首先点击New Project 接下来: (1). 我们点击Spring Initializr来创建。 (2). 填写项目名称 (3). 选择路径 (4). 选择JDK------这里笔者选用jdk17。 (5). java选择对应版本即可。 (6). 其余选项如无特殊需求保持默认即可。 然后点击Next。 稍等一会,…...
Python 框架学习 Django篇 (十) Redis 缓存
开发服务器系统的时候,程序的性能是至关重要的。经过我们前面框架的学习,得知一个请求的处理基本分为接受http请求、数据库处理、返回json数据,而这3个部分中就属链接数据库请求的响应速度最慢,因为数据库操作涉及到数据库服务处理…...
考研数学笔记:线性代数中抽象矩阵性质汇总
在考研线性代数这门课中,对抽象矩阵(矩阵 A A A 和矩阵 B B B 这样的矩阵)的考察几乎贯穿始终,涉及了很多性质、运算规律等内容,在这篇考研数学笔记中,我们汇总了几乎所有考研数学要用到的抽象矩阵的性质…...
C语言--假设共有鸡、兔30只,脚90只,求鸡、兔各有多少只
一.题目描述 假设共有鸡、兔30只,脚90只,求鸡、兔各有多少只? 二.思路分析 本题是一个典型的穷举法例题,而穷举法,最重要的就是条件判断。⭐⭐ 本题中的条件很容易发现: 假设鸡有x只,兔有y只…...
nacos适配达梦数据库
一、下载源码 源码我直接下载gitee上nacos2.2.3的,具体链接:https://gitee.com/mirrors/Nacos/tree/2.2.3,具体如下图: 二、集成达梦数据库驱动 解压源码包,用idea打开源码,等idea和maven编译完成ÿ…...
CTFhub-RCE-读取源代码
源代码: <?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用于配置,部署,和被管理被控节点的剧本 playbook常用的YMAL格式:(文件名称以 .yml结尾) 1、文件的第一行应该以 "---" (三个连字符)开始,表明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. 常用简单配置选项: 3. 使用插件 1.什么是vim Vim 是从 vi 发展出…...
Redhat7查看时区、修改时区
问题: 安装好redhat7之后,发现时间和物理机上面的网络时间不一致,于是查看本着修改时间的目的,却发现原来是时区的问题。 解决步骤: 查看时区状态信息 timedatectl修改时区到亚洲/上海 timedatectl set-timezone A…...
OpenCV踩坑笔记使用笔记入门笔记整合SpringBoot笔记大全
springboot开启摄像头抓拍照片并上传实现&问题记录 NotAllowedErrot: 请求的媒体源不能使用,以下情况会返回该错误: 当前页面内容不安全,没有使用HTTPS没有通过用户授权NotFoundError: 没有找到指定的媒体通道NoReadableError: 访问硬件设备出错Ov…...
【数据结构】栈和队列的模拟实现(两个方式实现)
前言 💓作者简介: 加油,旭杏,目前大二,正在学习C,数据结构等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏…...
OpenCV+相机校准和3D重建
相机校准至少需要10个测试图案,所需的重要输入数据是3D现实世界点集以及图像中这些点的相应2D坐标。3D点称为对象点,而2D图像点称为图像点。 准备工作 除了棋盘,我们还可以使用圆形网格。 在这种情况下,我们必须使用函数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项目如何指定配置文件
方法一: 方法二: 举例:...
在 uniapp 中 一键转换单位 (px 转 rpx)
在 uniapp 中 一键转换单位 px 转 rpx Uni-app 官方转换位置利用【px2rpx】插件Ctrl S一键全部转换下载插件修改插件 Uni-app 官方转换位置 首先在App.vue中输入这个: uni.getSystemInfo({success(res) {console.log("屏幕宽度", res.screenWidth) //屏…...
SQL对数据进行去重
工作中使用SQL对数据进行处理计算时可能会遇到这样的问题;读取的表数据会有重复,或者我们关注的几个字段的数据会有重复,直接使用原表数据会引起计算结果不准或者做表连接时产生笛卡尔积。 本文记录使用SQL进行数据去重的几种算法。 distinc…...
登录注册代码模板(Vue3+SpringBoot)[邮箱发送验证码(HTML)、RSA 加密解密(支持长文本)、黑暗与亮色主题切换、AOP信息校验]
文章归档:https://www.yuque.com/u27599042/coding_star/cx5ptule64utcr9e 仓库地址 https://gitee.com/tongchaowei/login-register-template 网页效果展示 相关说明 在该代码模板中,实现了如下功能: 邮箱发送验证码(邮件内容…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
