30天拿下Python之logging模块

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 30天拿下Python之logging模块

概述

在上一节,我们介绍了Python的collections模块,包括:collections模块中一些常用的函数和类。在这一节,我们将介绍Python的logging模块。logging模块是一个用于记录和调试的标准库,它提供了一种灵活的方式来记录不同级别的消息,比如:调试信息、错误信息、警告信息等。这个模块非常有用,因为它可以帮助开发者理解应用程序在运行时到底发生了什么。当程序出现错误或异常时,通过合理的日志记录,我们可以迅速定位问题,了解问题的来龙去脉。

logging的基本使用

在Python中,logging模块的使用比较简单。导入logging模块后,通过调用basicConfig方法可以进行基本的配置。比如:可以设置日志级别、日志输出位置、日志格式等。

import logging
logging.basicConfig(level = logging.INFO,
                    format = '%(asctime)s - %(levelname)s - %(message)s',
                    filename = 'app.log',
                    filemode = 'w')

进行上述的基本配置后,我们就可以创建logger对象,并调用其各种方法来记录日志信息了。

logger = logging.getLogger('my_logger')
logger.debug('Debug message')
logger.info('Info message')
logger.warning('Warning message')
logger.error('Error message')
logger.critical('Critical message')

执行上述的示例代码后,会在当前目录下生成app.log文件,其内容如下。

2023-09-24 19:44:43,086 - INFO - Info message
2023-09-24 19:44:43,086 - WARNING - Warning message
2023-09-24 19:44:43,086 - ERROR - Error message
2023-09-24 19:44:43,086 - CRITICAL - Critical message

可以看到,logger.debug函数写入的调试信息没有出现在文件中。这是因为,我们指定了日志级别为logging.INFO,比该日志级别低的信息会被过滤掉,不会写入日志文件中。

logging的选项设置

logging模块提供了很多选项来配置日志记录的行为,以下是一些常见的选项。

日志记录器名称:每个记录器都有一个名称,可以通过名称来获取和配置特定的记录器。

日志级别:一共有五个级别的日志记录,从低到高依次为:DEBUG、INFO、WARNING、ERROR、

CRITICAL。我们可以设置日志记录器的级别,这样低于该级别的所有消息都不会被记录。比如:如果级别设置为WARNING,那么DEBUG和INFO级别的消息将不会被记录。

日志格式:可以通过设置日志记录器的格式字符串来改变日志消息的显示方式。比如:可以包含时间戳、日志级别、消息、线程名等。

日志输出地:日志消息可以输出到多种地方,比如:控制台、文件等。可以使用多种Handler来实现,比如:输出到控制台使用StreamHandler、输出到文件使用FileHandler等。

日志旋转:如果日志文件可能会变得很大,我们需要在满足某个条件(比如:日志文件达到一定大小)时创建一个新的日志文件,这可以通过使用RotatingFileHandler或TimedRotatingFileHandler等处理程序来实现。

日志过滤:可以通过使用过滤器来进一步定制哪些消息应该被记录。比如:我们可以设置一个过滤器,只有包含特定关键字的消息才会被记录。

在下面的示例代码中,我们创建了一个名为'my_logger'的日志记录器,并设置了其级别为DEBUG。然后,我们创建了一个写入日志文件的处理器和一个输出到控制台的处理器,并设置了他们的级别。我们还定义了日志消息的格式,并将其应用到了两个处理器上。最后,我们用这个记录器记录了一条警告信息。

import logging
# 创建一个logger
logger = logging.getLogger('my_logger')
# 设置日志级别
logger.setLevel(logging.DEBUG)
 
# 创建一个Handler,用于写入日志文件
fileHandler = logging.FileHandler('app.log')
# 设置日志级别
fileHandler.setLevel(logging.DEBUG)
# 创建一个Handler,用于输出到控制台
consoleHandler = logging.StreamHandler()
# 设置日志级别
consoleHandler.setLevel(logging.INFO)
# 定义Handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fileHandler.setFormatter(formatter)
consoleHandler.setFormatter(formatter)
# 给logger添加Handler
logger.addHandler(fileHandler)
logger.addHandler(consoleHandler)
# 记录一条日志
# 输出:2023-09-24 20:06:26,828 - my_logger - WARNING - a warning info
logger.warn('a warning info')
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
日志旋转
在logging模块中,可以使用RotatingFileHandler和TimedRotatingFileHandler来实现日志旋转。
RotatingFileHandler根据日志文件的大小来旋转日志文件。可以通过设置maxBytes参数来指定每个日志文件的大小,同时通过backupCount参数来指定保留的备份文件数量。当日志文件达到设定的最大大小时,原日志文件将被重命名并备份,同时开始写入新的日志文件。
TimedRotatingFileHandler则根据时间间隔来旋转日志文件。可以通过设置interval参数来指定时间间隔,同时通过backupCount参数来指定保留的备份文件数量。当达到设定的时间间隔时,原日志文件将被重命名并备份,同时开始写入新的日志文件。
import logging
import logging.handlers
 
# 创建一个Logger对象
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 创建一个RotatingFileHandler对象
maxSize = 1 << 20
handler = logging.handlers.RotatingFileHandler('app.log', maxBytes = maxSize, backupCount = 5)
 
# 设置日志级别和格式
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
# 记录日志消息
logger.info('Info message')

在上面的示例代码中,我们创建了一个RotatingFileHandler对象,并指定了日志文件的最大大小为1MB字节,同时保留5个备份文件。当日志文件达到设定的最大大小时,原日志文件将被重命名并备份,同时开始写入新的日志文件。

logging.Filter类

logging.Filter类用于过滤日志消息。它有一个名为filter的函数,用于确定是否应该记录或传递日志消息。我们可以创建一个Filter类的派生类,并覆盖其filter函数。该函数接受一个日志记录对象作为参数,并返回一个布尔值,用于表示是否应该记录或传递该日志消息。如果该函数返回True,则日志消息将被记录或传递,否则将被忽略。

import logging  
 
LOG_FORMAT = '%(levelname)s %(asctime)s - %(message)s'
logging.basicConfig(filename = "app.log", level = logging.DEBUG, format = LOG_FORMAT)
my_logger = logging.getLogger('my_logger')
my_logger.setLevel(logging.DEBUG)
# 创建一个名为my_handler的处理器,并将其添加到my_logger中
my_handler = logging.StreamHandler()
my_handler.setLevel(logging.DEBUG)
my_handler.setFormatter(logging.Formatter(LOG_FORMAT))
my_logger.addHandler(my_handler)
 
# 创建一个名为filter的过滤器,并将其添加到my_handler中
class CustomFilter(logging.Filter):
    def filter(self, record):
        return 'Hope' in record.msg
filter = CustomFilter()
my_handler.addFilter(filter)
 
# 记录一些消息
my_logger.debug('Hello Hope')
my_logger.info('Hello World')
my_logger.warning('Hope web site')
my_logger.error('GitHub web site')

在上面的示例代码中,我们首先使用basicConfig方法定义了一个基本的日志配置。然后,创建了一个名为my_logger的记录器,并将其级别设置为DEBUG。接下来,我们创建了一个名为my_handler的处理器,并将其添加到my_logger中。我们还创建了一个名为filter的过滤器,并将其添加到my_handler中,以过滤掉日志信息中不包含"Hope"字符串的日志。最后,我们使用my_logger记录了几条不同级别的日志消息。执行上面的代码后,只有“Hello Hope”和“Hope web site”这两条日志信息会被保存和输出。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
22天前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
206 7
|
1月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
194 0
|
27天前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
229 4
|
23天前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
187 0
|
24天前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
127 0
|
2月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
108 4
|
2月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
238 0
|
3月前
|
存储 安全 数据处理
Python 内置模块 collections 详解
`collections` 是 Python 内置模块,提供多种高效数据类型,如 `namedtuple`、`deque`、`Counter` 等,帮助开发者优化数据处理流程,提升代码可读性与性能,适用于复杂数据结构管理与高效操作场景。
267 0
|
4月前
|
数据安全/隐私保护 Python
抖音私信脚本app,协议私信群发工具,抖音python私信模块
这个实现包含三个主要模块:抖音私信核心功能类、辅助工具类和主程序入口。核心功能包括登录
|
7月前
|
Python
Python教程:os 与 sys 模块详细用法
os 模块用于与操作系统交互,主要涉及夹操作、路径操作和其他操作。例如,`os.rename()` 重命名文件,`os.mkdir()` 创建文件夹,`os.path.abspath()` 获取文件绝对路径等。sys 模块则用于与 Python 解释器交互,常用功能如 `sys.path` 查看模块搜索路径,`sys.platform` 检测操作系统等。这些模块提供了丰富的工具,便于开发中处理系统和文件相关任务。
312 14

推荐镜像

更多