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”这两条日志信息会被保存和输出。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
5天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
18 5
|
15天前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
|
18天前
|
数据采集 Web App开发 JavaScript
python-selenium模块详解!!!
Selenium 是一个强大的自动化测试工具,支持 Python 调用浏览器进行网页抓取。本文介绍了 Selenium 的安装、基本使用、元素定位、高级操作等内容。主要内容包括:发送请求、加载网页、元素定位、处理 Cookie、无头浏览器设置、页面等待、窗口和 iframe 切换等。通过示例代码帮助读者快速掌握 Selenium 的核心功能。
62 5
|
22天前
|
Python
SciPy 教程 之 SciPy 模块列表 6
SciPy教程之常量模块介绍:涵盖公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率及力学单位。示例展示了角度单位转换为弧度的几个常用常量。
17 7
|
22天前
|
Python
SciPy 教程 之 SciPy 模块列表 7
`scipy.constants` 模块提供了常用的时间单位转换为秒数的功能。例如,`constants.hour` 返回 3600.0 秒,表示一小时的秒数。其他常用时间单位包括分钟、天、周、年和儒略年。
17 6
|
19天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
17 1
|
20天前
|
XML 前端开发 数据格式
超级详细的python中bs4模块详解
Beautiful Soup 是一个用于从网页中抓取数据的 Python 库,提供了简单易用的函数来处理导航、搜索和修改分析树。支持多种解析器,如 Python 标准库中的 HTML 解析器和更强大的 lxml 解析器。通过简单的代码即可实现复杂的数据抓取任务。本文介绍了 Beautiful Soup 的安装、基本使用、对象类型、文档树遍历和搜索方法,以及 CSS 选择器的使用。
51 1
|
21天前
|
Python
SciPy 教程 之 SciPy 模块列表 9
SciPy教程之常量模块介绍,涵盖多种单位类型,如公制、质量、角度、时间、长度、压强等。示例展示了如何使用`scipy.constants`模块查询不同压强单位对应的帕斯卡值,包括atm、bar、torr、mmHg和psi。
13 1
|
21天前
|
Python
SciPy 教程 之 SciPy 模块列表 8
SciPy教程之常量模块单位类型介绍。该模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例展示了部分长度单位的转换值,例如英寸、英尺、海里等。
14 1
|
23天前
|
知识图谱 Python
SciPy 教程 之 SciPy 模块列表 5
本教程介绍SciPy常量模块中的单位类型,涵盖公制、质量、时间、长度等单位。示例代码展示了如何使用`scipy.constants`模块获取不同质量单位的千克值,如公吨、磅、盎司、原子质量单位等。
15 1