《Python基础教程》 19.5 日志
日志与第16章讨论的测试有一定的关系,而且在需要大规模改造程序的内部构造时很有用,它无疑能够帮助你发现问题和bug。日志大致上就是收集与程序运行相关的数据,供你事后进行研究或积累。
日志的最简单实现形式是:打开一个文件,用print语句写入内容,关闭文件。
更规范的做法是使用标准库中的模块logging。这个模块的基本用法非常简单,代码清单19-3所示的程序证明了这一点。
import logging
logging.basicConfig(level=logging.INFO, filename='mylog.log')
logging.info('Starting program')
logging.info('Trying to divide 1 by 0')
print(1 / 0)
logging.info('The division succeeded')
logging.info('Ending program')
运行这个程序时,将生成下面的日志文件:
INFO:root:Starting program
INFO:root:Trying to divide 1 by 0
如你所见,试图将1除以0后什么都没有记录下来,因为这种错误将导致程序终止。这是一种简单的错误,你可根据程序崩溃时在终端打印的异常来跟踪确定问题出在什么地方。
不会导致程序终止、而只是让它行为异常的bug是最难查找的,但通过查看详尽的日志文件也许能够帮助你找出问题出在什么地方。
聚合搜索结果
Python 的 logging 模块提供了一种灵活的日志记录系统,适用于应用程序和库。这个模块定义了函数和类,用于实现事件日志记录,所有 Python 模块都可以参与日志记录,这意味着您的应用程序日志可以包含您自己的消息和第三方模块的消息。
基本用法
在 Python 中,可以通过 logging 模块的 basicConfig
方法进行基本配置,然后使用不同的日志级别函数(如 debug, info, warning, error, critical)来记录日志。以下是一个简单的示例:
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 创建 logger 对象
logger = logging.getLogger(__name__)
# 记录不同级别的日志
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")
日志级别
logging 模块默认定义了多个日志级别,日志优先级从高到低为:CRITICAL > ERROR > WARNING > INFO > DEBUG。当日志级别设置为某个级别时,低于该级别的日志将不会被输出。例如,如果日志级别设置为 INFO,则 DEBUG 级别的日志将不会被输出。
高级用法
除了基本用法外,logging 模块还支持更高级的功能,如将日志同时输出到屏幕和文件、日志轮转、通过 JSON 或 YAML 文件配置日志等。例如,使用 RotatingFileHandler 可以实现日志文件的轮转,当日志文件达到一定大小时,它会自动创建新的日志文件,并保留旧的日志文件。
配置文件
从 Python 2.7 开始,可以通过字典、JSON 或 YAML 文件来加载和配置日志。这种方式更加灵活,可以轻松地在不同环境中切换日志配置,而无需修改代码。
轮转日志示例
以下是一个使用 RotatingFileHandler 的示例,它设置了日志文件的最大大小和备份数量:
import logging
from logging.handlers import RotatingFileHandlerlogger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
rHandler = RotatingFileHandler('log.txt', maxBytes=1*1024, backupCount=3)
rHandler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
rHandler.setFormatter(formatter)
logger.addHandler(rHandler)logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")