1. logging 模块简介
在软件开发过程中,了解程序的运行状态、记录重要事件以及排查错误是至关重要的。logging
模块为 Python 提供了灵活且强大的日志记录功能。它允许开发者控制日志的输出内容、输出位置(如文件、控制台)、日志级别(用于过滤不同重要程度的日志信息)等,帮助开发者更好地监控和调试程序。
2. 基本使用
- 简单配置与输出:
import logging
# 配置日志基本设置
logging.basicConfig(level = logging.INFO)
# 记录不同级别的日志
logging.debug('这是一条调试信息')
logging.info('这是一条一般信息')
logging.warning('这是一条警告信息')
logging.error('这是一条错误信息')
logging.critical('这是一条严重错误信息')
在上述代码中:
- logging.basicConfig(level = logging.INFO)
配置了日志的基本设置,这里将日志级别设置为 INFO
。只有级别大于或等于 INFO
的日志信息才会被输出,所以 DEBUG
级别的日志不会显示。
- logging.debug()
、logging.info()
、logging.warning()
、logging.error()
和 logging.critical()
分别用于记录不同级别的日志信息。
3. 日志级别
- DEBUG:最低级别,用于记录调试信息,通常在开发过程中使用,帮助开发者追踪代码执行流程、检查变量值等。
- INFO:用于记录一般信息,比如程序启动、某个功能模块正常运行的提示等,帮助开发者了解程序的正常运行状态。
- WARNING:表示可能存在问题,但程序仍能继续运行,例如使用了已废弃的函数、配置参数可能不正确等情况。
- ERROR:表示程序发生错误,某些功能无法正常执行,但程序可能仍在运行,此时需要开发者排查错误原因。
- CRITICAL:最高级别,意味着程序发生了严重错误,可能导致程序无法继续运行,例如数据库连接丢失、关键文件损坏等。
4. 日志输出格式
可以通过 basicConfig
的 format
参数自定义日志输出格式。
import logging
logging.basicConfig(
level = logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logging.info('自定义格式的信息')
在这个例子中:
%(asctime)s
表示日志记录的时间。%(levelname)s
表示日志级别(如DEBUG
、INFO
等)。%(message)s
表示具体的日志信息内容。
运行代码后,输出可能类似2024 - 11 - 01 10:30:00 - INFO - 自定义格式的信息
,其中时间部分会根据实际记录时间显示。
5. 输出到文件
除了输出到控制台,也可以将日志记录到文件中。
import logging
logging.basicConfig(
level = logging.INFO,
filename='app.log',
format='%(asctime)s - %(levelname)s - %(message)s'
)
logging.info('这条信息会写入文件')
这里通过 filename='app.log'
参数指定将日志记录到名为 app.log
的文件中。每次运行程序,新的日志信息会追加到文件末尾。
6. 日志处理器(Handler)和格式化器(Formatter)
- 处理器(Handler):
logging
模块有多种处理器,用于决定日志输出的目的地。例如StreamHandler
用于输出到控制台,FileHandler
用于输出到文件。可以创建多个处理器并添加到日志记录器中。
import logging
# 创建日志记录器
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 创建文件处理器
file_handler = logging.FileHandler('debug.log')
file_handler.setLevel(logging.DEBUG)
# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 创建格式化器并添加到处理器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 将处理器添加到日志记录器
logger.addHandler(file_handler)
logger.addHandler(console_handler)
# 记录日志
logger.debug('这是一条调试信息,会写入文件')
logger.info('这是一条一般信息,会输出到控制台和文件')
在上述代码中:
- 创建了一个名为 __name__
的日志记录器,并设置其日志级别为 DEBUG
。
- 创建了 FileHandler
用于将日志记录到 debug.log
文件,设置其级别为 DEBUG
;创建 StreamHandler
用于输出到控制台,设置其级别为 INFO
。
- 创建了一个格式化器,并将其添加到文件处理器和控制台处理器。
- 最后将两个处理器添加到日志记录器中,这样不同级别的日志信息会根据处理器的设置分别输出到文件和控制台。
- 格式化器(Formatter):如上述代码中的
Formatter
,通过不同的占位符来定制日志信息的显示格式,以满足不同的需求。