python中的logging模块:从入门到高阶

news2025/3/13 0:04:13

在这里插入图片描述

简单使用

在 Python 中,可以使用内置的 logging 模块来记录应用程序的信息。最简单的用法是使用 basicConfig() 函数配置 logging 模块,然后使用 getLogger() 方法创建一个 Logger 对象,用于记录信息。下面是一个简单的例子:

import logging

# 配置 logging
logging.basicConfig(level=logging.DEBUG)

# 创建 logger 对象
logger = logging.getLogger()

# 记录信息
logger.debug('这是一条调试信息')
logger.info('这是一条普通信息')
logger.warning('这是一条警告信息')
logger.error('这是一条错误信息')
logger.critical('这是一条严重错误信息')

在上面的例子中,我们使用 basicConfig() 函数设置日志级别为 DEBUG(最详细的日志信息),然后使用 getLogger() 方法创建了一个 Logger 对象。接下来,我们使用 Logger 对象的不同方法记录不同级别的信息。日志级别的优先级从低到高依次是 DEBUG、INFO、WARNING、ERROR、CRITICAL。

日志格式

logging 模块支持自定义日志格式,可以使用 format 参数来指定日志格式。日志格式可以包括时间、日志级别、日志信息等。下面是一个自定义日志格式的例子:

import logging

# 配置 logging
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)s %(message)s')

# 创建 logger 对象
logger = logging.getLogger()

# 记录信息
logger.debug('这是一条调试信息')
logger.info('这是一条普通信息')
logger.warning('这是一条警告信息')
logger.error('这是一条错误信息')
logger.critical('这是一条严重错误信息')

在上面的例子中,我们使用 format 参数指定了日志格式,其中 %(asctime)s 表示时间,%(levelname)s 表示日志级别,%(message)s 表示日志信息。

输出到文件

logging 模块支持将日志输出到文件中,可以使用 filename 和 filemode 参数来指定输出文件名和打开模式。下面是一个将日志输出到文件中的例子:

import logging

# 配置 logging
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filename='app.log',
                    filemode='w')

# 创建 logger 对象
logger = logging.getLogger()

# 记录信息
logger.debug('这是一条调试信息')
logger.info('这是一条普通信息')
logger.warning('这是一条警告信息')
logger.error('这是一条错误信息')
logger.critical('这是一条严重错误信息')

在上面的例子中,我们使用 filename 参数指定输出文件名为 app.log,使用 filemode 参数指定打开模式为 w(覆盖写入)。

处理程序(Handler)

logging 模块提供了处理程序(Handler)的概念,用于处理日志记录的输出。默认情况下,日志记录会输出到控制台。我们可以添加一个或多个处理程序来指定不同的日志输出方式。例如,可以将日志输出到文件、网络、数据库等。下面是一个将日志输出到文件和控制台的例子:

import logging

# 创建 logger 对象
logger = logging.getLogger()

# 创建控制台处理程序并设置日志级别
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)

# 创建文件处理程序并设置日志级别
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.DEBUG)

# 创建日志格式器
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

# 设置处理程序的日志格式器
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# 添加处理程序到 logger 对象
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# 记录信息
logger.debug('这是一条调试信息')
logger.info('这是一条普通信息')
logger.warning('这是一条警告信息')
logger.error('这是一条错误信息')
logger.critical('这是一条严重错误信息')

在上面的例子中,我们创建了一个 Logger 对象,并添加了两个处理程序:一个控制台处理程序和一个文件处理程序。我们还创建了一个日志格式器,并将其设置为处理程序的格式器。然后,我们将处理程序添加到 Logger 对象中,最后记录了一些信息。由于控制台处理程序的日志级别设置为 INFO,因此调试信息不会输出到控制台。

过滤器(Filter)

logging 模块还提供了过滤器(Filter)的概念,用于对日志记录进行过滤。可以使用过滤器来控制哪些日志记录应该被处理,哪些不应该被处理。下面是一个使用过滤器的例子:

import logging

# 创建 logger 对象
logger = logging.getLogger()

# 创建控制台处理程序并设置日志级别
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)

# 创建过滤器并设置过滤条件
class CustomFilter(logging.Filter):
    def filter(self, record):
        return record.msg.startswith('警告')

filter = CustomFilter()

# 设置处理程序的过滤器
console_handler.addFilter(filter)

# 创建日志格式器
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

# 设置处理程序的日志格式器
console_handler.setFormatter(formatter)

# 添加处理程序到 logger 对象
logger.addHandler(console_handler)

# 记录信息
logger.debug('这是一条调试信息')
logger.info('这是一条普通信息')
logger.warning('警告:这是一条警告信息')
logger.warning('这是又一条警告信息')
logger.error('这是一条错误信息')
logger.critical('这是一条严重错误信息')

在上面的例子中,我们创建了一个 Logger 对象,并添加了一个控制台处理程序。我们还创建了一个过滤器,并将其设置为控制台处理程序的过滤器。过滤器的 filter()方法用于指定哪些记录应该被处理,它返回 True 或 False表示是否处理该记录。在这个例子中,我们创建了一个自定义过滤器 CustomFilter,用于只处理以“警告”开头的日志记录。

高级使用

除了上述介绍的基本用法外,logging 模块还提供了一些高级功能,如日志回溯、日志轮换、日志缓冲等。

日志回溯

logging 模块支持记录回溯信息,可以使用 exc_info 参数来记录当前异常的回溯信息。

在 Python 中,当程序发生异常时,解释器会自动输出异常信息和回溯信息。异常信息通常包含异常类型和异常消息,回溯信息包含了程序执行时的堆栈信息,即函数调用栈的跟踪信息。回溯信息可以帮助开发人员定位程序错误的根源。

日志回溯是使用 logging 模块记录程序发生的异常信息和回溯信息。可以使用 Logger 对象的 error()、exception() 或 critical() 方法来记录异常信息和回溯信息。这些方法会自动记录当前异常的类型、消息和回溯信息,无需额外的代码

下面是一个记录回溯信息的例子:

import logging

# 配置 logging
logging.basicConfig(level=logging.DEBUG)

# 创建 logger 对象
logger = logging.getLogger()

# 记录信息和回溯信息
try:
    1/0
except Exception as e:
    logger.error('发生异常', exc_info=True)

在上面的例子中,我们使用 exc_info=True 参数记录了当前异常的回溯信息。当发生异常时,日志记录将包括异常信息和回溯信息。

2023-04-19 15:47:36,688 ERROR 发生异常
Traceback (most recent call last):
  File "<ipython-input-1-728869f0c30f>", line 7, in <module>
    1/0
ZeroDivisionError: division by zero

日志轮换

logging 模块支持日志轮换功能,可以将日志按时间或大小轮换到不同的文件中。

日志轮换(Log Rotation)是指在日志文件大小达到一定值或一定时间间隔后,自动将当前日志文件备份并创建一个新的日志文件,以便管理和维护。日志轮换可以避免日志文件过大、影响系统性能和管理不便等问题。

在 Python 的 logging 模块中,可以使用 logging.handlers 模块中的 RotatingFileHandler 和 TimedRotatingFileHandler 类来实现日志轮换功能。其中,RotatingFileHandler 类是按文件大小轮换日志文件,TimedRotatingFileHandler 类是按时间轮换日志文件。

下面是一个按时间轮换日志的例子:

import logging
from logging.handlers import TimedRotatingFileHandler

# 创建 logger 对象
logger = logging.getLogger()

# 创建按时间轮换的文件处理程序
handler = TimedRotatingFileHandler('app.log', when='midnight', backupCount=7)

# 创建日志格式器
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

# 设置处理程序的日志格式器
handler.setFormatter(formatter)

# 添加处理程序到 logger 对象
logger.addHandler(handler)

# 记录信息
logger.debug('这是一条调试信息')
logger.info('这是一条普通信息')
logger.warning('这是一条警告信息')
logger.error('这是一条错误信息')
logger.critical('这是一条严重错误信息')

在上面的例子中,我们创建了一个按时间轮换的文件处理程序,它会在每天的午夜时分割日志文件。when 参数可以指定分割的时间点,backupCount 参数可以指定保留的日志文件个数。在使用 TimedRotatingFileHandler 类型的日志处理器对象时,会根据指定的时间间隔创建新的日志文件,并在文件名中添加时间戳后缀。

具体来说,当日志文件发生轮换时,会在原来的日志文件名后面添加一个时间戳后缀,例如:

  • 原始日志文件名为 app.log,当轮换发生时,会将其备份为 app.log.2023-04-20,其中 2023-04-20 为轮换时的日期。
  • 下次轮换发生时,会将原始日志文件名为 app.log 的文件备份为 app.log.2023-04-21,同时将 app.log.2023-04-20 删除,以保持日志文件的数量在备份数量之内。

因此,使用 TimedRotatingFileHandler 类型的日志处理器对象时,每个日志文件名中都会包含时间戳后缀,以便区分不同的日志文件。

日志缓冲

在使用 logging 模块记录日志时,默认情况下,每条日志信息都会立即写入到磁盘文件中。这样会频繁地访问磁盘,导致程序性能下降。

为了避免频繁访问磁盘,logging 模块提供了缓冲机制。当使用缓冲机制时,多条日志信息会先存储在内存中,直到满足一定条件后再将它们写入磁盘文件。通过这种方式可以减少频繁访问磁盘的次数,提高程序的性能和效率。

在 logging 模块中,可以使用 logging.handlers 模块中的 BufferingHandler 类来实现日志缓冲机制。BufferingHandler 类中的 bufferSize 参数指定了缓冲区的大小。当日志信息达到缓冲区的容量时,就会将缓冲区中的信息写入磁盘文件。

下面是一个使用日志缓冲机制的例子:

import logging
from logging.handlers import BufferingHandler

# 配置 logging
logging.basicConfig(level=logging.DEBUG)

# 创建 logger 对象
logger = logging.getLogger()

# 创建带缓冲的文件处理程序
handler = BufferingHandler(capacity=5)

# 将处理程序添加到 logger 对象
logger.addHandler(handler)

# 记录信息
for i in range(10):
    logger.debug('这是第 %s 条调试信息', i+1)

在上面的例子中,我们使用 BufferingHandler 类型的日志处理器对象创建了一个带缓冲的文件处理程序,并设置缓冲区的容量为 5。然后使用 logger 对象记录了 10 条日志信息。

由于缓冲区容量为 5,当记录了 5 条日志信息后,就会将它们一起写入磁盘文件。因此,第 1 条到第 5 条日志信息会被存储在内存缓冲区中,而第 6 条到第 10 条日志信息会被存储在内存缓冲区中,并在最后一次写入时一起写入到磁盘文件中。

通过这种方式,我们可以减少频繁访问磁盘的次数,提高程序的性能和效率。需要注意的是,设置过大的缓冲区容量可能会占用过多的内存,从而导致程序崩溃。因此,需要根据实际需求和系统资源进行权衡和设置。

总结

logging 模块是 Python 标准库中一个功能强大的日志记录工具。它可以记录应用程序的各种信息,并支持自定义日志格式、日志输出方式、日志级别、日志过滤器、日志回溯、日志轮换、日志缓冲等功能。使用 logging 模块可以帮助开发人员更好地调试和分析应用程序,提高开发效率和程序质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/433246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于html+css的图片展示16

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

No.043<软考>《(高项)备考大全》【第26章】软件工程国家标准

【第26章】软件工程国家标准 1 章节相关1.1 考试相关 2 标准2.1 标准级别及目录 3 软件工程术语4 软件生存周期过程、活动和任务4.1 必背4.2 ★软件生命周期各阶段与软件文档编制工作的关系--熟悉.4.3 各类人员与软件文档的使用关系--熟悉 5 文档控制5.1 SRS需求规格说明书 6 软…

一年一度的PMO大会将于2023年6月在京召开

企业要基业长青就必须持续保持组织活力。企业的内外部环境不会一成不变&#xff0c;顺应变化及时调整变革避免组织出现僵化低效才能在激烈的市场竞争中存活下来。PMO从成立到逐渐发挥越来越强的作用本身即是一种组织变革的过程&#xff0c;从这个意义上来说PMO因组织变革而生&a…

Nginx Rewrite

常用的Nginx正则表达式 ^&#xff1a;匹配输入字符串的起始位置 $ : 匹配输入字符串的结束位置 * : 匹配前面的字符零次或多次 &#xff1a;匹配前面的字符一次或多次 ?: 匹配前面的字符零次或一次 . : 匹配除“\n”之外的任何单个字符 ^$ : 空行 \&#xff1a;将后面…

百度发布Apollo城市智驾,距离AI智能驾驶还有多远?

推荐&#xff1a;将NSDT场景编辑器加入你的3D工具链。 工具集&#xff1a;NSDT简石数字孪生 随着人工智能技术的不断发展&#xff0c;智能驾驶已经成为了汽车行业的一个重要领域。智能驾驶可以减少人为驾驶的错误和疲劳驾驶等不安全因素&#xff0c;提高驾驶安全性&#xff0c…

内蒙农信携手星环科技建设农信大数据平台,激活金融业务创新

背景 内蒙古自治区农村信用社联合社&#xff08;简称“内蒙农信”&#xff09;经过多年的信息化建设&#xff0c;目前投产使用的信息化系统近100套&#xff0c;产生了大量的数据。该社于2019年采用MPP架构的分布式数据库&#xff0c;实现了40多套业务系统数据的归集、标准化处理…

1007、1009:与进制问题、输出问题

1007 题目&#xff1a;本题要求计算A/B&#xff0c;其中A是不超过1000位的正整数&#xff0c;B是1位正整数。你需要输出商数Q和余数R&#xff0c;使得A B * Q R成立 思路&#xff1a;对于数字元素拆分&#xff0c;除法的计算方法用代码实现&#xff08;唯一一点就是在输出的…

如何一招搞定PCB阻焊过孔问题?

PCB阻焊油墨根据固化方式&#xff0c;阻焊油墨有感光显影型的油墨&#xff0c;有热固化的热固油墨&#xff0c;还有UV光固化的UV油墨。而根据板材分类&#xff0c;又有PCB硬板阻焊油墨&#xff0c;FPC软板阻焊油墨&#xff0c;还有铝基板阻焊油墨&#xff0c;铝基板油墨也可以用…

Elasticsearch:使用 Elastic APM 监控 Android 应用程序(二)

在我之前的文章 “Elasticsearch&#xff1a;使用 Elastic APM 监控 Android 应用程序&#xff08;一&#xff09;” 中&#xff0c;我详述了如何使用 Elastic APM 来监控 Android 应用程序。在今天的文章中&#xff0c;我来详述如何部署 Elastic Stack&#xff0c;并使用文章中…

《港联证券》新三板股票交易规则是什么?如何进行交易?

新三板分为根底层、创新层和精选层。新三板股票设置了一些规则&#xff0c;既约束了一些新三板挂牌公司的股权进入生意市场&#xff0c;一起也约束了一些投资者进行投资&#xff0c;保证了新三板市场的安全。那么新三板股票生意规则是什么&#xff1f;怎么进行生意&#xff1f;…

【PMP】项目各阶段分别运用什么工具与技术汇总

做项目管理是一条漫漫长路&#xff0c;所有的本事&#xff0c;都是靠一个个项目&#xff0c;一点点积累而来的&#xff0c;并不存在“迅速上手”的方法论。一名普通项目经理的成长&#xff0c;都要经过一定时间的修炼。 数据收集 头脑风暴 在短时间内获得大量创意&#xff0…

「ML 实践篇」模型训练

在训练不同机器学习算法模型时&#xff0c;遇到的各类训练算法大多对用户都是一个黑匣子&#xff0c;而理解它们实际怎么工作&#xff0c;对用户是很有帮助的&#xff1b; 快速定位到合适的模型与正确的训练算法&#xff0c;找到一套适当的超参数等&#xff1b;更高效的执行错…

SSM--mybatis逆向工程生成

SSM学习笔记–mybatis逆向工程生成 文章目录SSM学习笔记--mybatis逆向工程生成1. 创建数据库和表2. Mybatis Generator 逆向工程1. 创建数据库和表 -- 创建 furns_ssm DROP DATABASE IF EXISTS furn_ssm; CREATE DATABASE furn_ssm; USE furn_ssm;-- 创建家居表 CREATE TABLE …

Node.js—fs模块

目录 1、什么是fs2、同步和异步调用3、文件写入3.1 writeFile 异步写入3.2 writeFileSync 同步写入3.3 appendFile / appendFileSync 追加写入3.4 createWriteStream 流式写入3.5 写入文件的场景 4、文件读取4.1 readFile 异步读取4.2 readFileSync 同步读取4.3 createReadStre…

C++基础知识总结(详解)

前言 文章篇幅较大&#xff0c;内容充实 请在阅读的过程中保持一个批判的态度 C基础 C头文件 C有自己的头文件&#xff0c;例如iostream 没有.h 也可以用C的头文件 例如stdio.h 有.h 或者将C文件C化 例如cstdio 前面加c没有.h 名字空间 划分逻辑单元。避免名字冲突 创建…

JWT 实现登录认证 + Token 自动续期方案

前言 过去这段时间主要负责了项目中的用户管理模块&#xff0c;用户管理模块会涉及到加密及认证流程。今天就来讲讲认证功能的技术选型及实现。技术上没啥难度当然也没啥挑战&#xff0c;但是对一个原先没写过认证功能的菜鸡来说也是一种锻炼吧。 技术选型 要实现认证功能&a…

【短篇】函数重载

函数重载 重载使用规则 重载 函数重载也是CPP相较于C的一个优化内容。 在C中我们都知道函数名不能重名 当然这个错误对于我还有类似我这种只学过C的人来说&#xff0c;这个错误是显得多么理所当然。 但是在Cpp中&#xff0c;则对这个功能进行了优化 看到这就有人问了&#x…

我去蔚来试驾了

前面写了比亚迪汉、小鹏P7i的试驾体验&#xff0c;链接如下&#xff1a; 小鹏P7I试驾体验&#xff01; 今天接着分享蔚来ET5的试驾体验&#xff0c;实话实说&#xff0c;我是蔚来ET5的颜粉&#xff0c;颜值也是ET5最大的卖点之一。 我身边不少朋友&#xff0c;不管是男生还是女…

windows下使用vite搭建vue开发环境

windows下使用vite搭建vue开发环境 1 下载安装配置NodeJS1.1 下载1.2 安装1.3 配置1.4 npm镜像加速配置1.6 设置环境变量 2 Vite安装 1 下载安装配置NodeJS 1.1 下载 下载地址&#xff1a;https://nodejs.cn/download 到NodeJS官网&#xff0c;选择Windows安装包即可。 1.2…

网络协议-UDP vs TCP, HTTP2.0和3.0

目录 TCP vs UDP Internet协议群&#xff08;TCP/IP协议群&#xff09; 传输层和网络层 User Data Diagram&#xff08;UDP&#xff09; 连接 重发&#xff08;校验&#xff09; UDP不保证顺序 思考&#xff1a;看了上面的几点&#xff0c;UDP没有虚拟连接、不校验数据、…