Python 日志
术语”logging”指的是记录某个过程中不同中间事件的机制。在软件应用程序中记录日志有助于开发人员调试和追踪应用程序逻辑中的任何错误。Python的标准库包括logging模块,可以生成和记录应用程序日志。
通常的做法是在程序中间使用print()语句以检查不同变量和对象的中间值。这有助于开发人员验证程序是否按预期行为。然而,与间歇性的打印语句相比,日志记录更有益,因为它提供了更多的事件洞察。
日志级别
日志记录的一个重要特性是您可以生成不同严重程度级别的日志消息。logging模块定义了以下级别及其值。
级别 | 使用时机 | 值 |
---|---|---|
debug | 详细信息,通常仅在诊断问题时感兴趣。 | 10 |
info | 确认事物按预期工作。 | 20 |
warning | 意外发生的迹象,或者预示着将来可能存在的问题(例如,“磁盘空间不足”)。软件仍然按预期工作。 | 30 |
error | 由于更严重的问题,软件无法执行某些功能。 | 40 |
critical | 严重错误,表明程序本身可能无法继续运行。 | 50 |
示例
下面的代码演示了如何生成日志消息。
import logging
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')
它将产生以下 输出 −
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical message
请注意,此处仅显示警告级别之后的日志消息。这是因为根 – 默认记录器忽略所有严重性级别高于警告的严重性级别。请注意,严重级别在每行的第一个冒号 (:) 之前被记录。同样,根是记录器的名称,也会显示在LogRecord中。
日志配置
程序生成的日志可以使用BasicConfig()方法进行自定义。您可以为配置定义以下一个或多个参数 –
- filename - 指定创建FileHandler,使用指定的文件名,而不是StreamHandler。
-
filemode - 如果指定了文件名,则以此模式打开文件。默认为’a’。
-
datefmt - 使用指定的日期/时间格式,格式必须符合time.strftime()的要求。
-
style - 如果指定了格式,则使用此样式的格式字符串。可选值包括’%’,'{‘或’$’,分别代表printf风格的格式、str.format()或string.Template。默认为’%’。
-
level - 将根记录器的级别设置为指定的级别。
-
errors - 如果指定了此关键字参数以及文件名,则在创建FileHandler时使用它的值,并在打开输出文件时使用它的值。如果未指定,将使用值’backslashreplace’。请注意,如果指定了None,它将按原样传递给open(),这意味着它将与传递’errors’相同。
示例
要记录所有高于DEBUG级别的消息,请将level参数设置为logging.DEBUG。
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug('This message will get logged')
它将产生以下输出: 输出 −
DEBUG:root:This message will get logged
使用filename参数将日志消息记录在文件中,而不是在控制台上回显。
import logging
logging.basicConfig(filename='logs.txt', filemode='w', level=logging.DEBUG)
logging.warning('This messagewill be saved to a file')
不会在控制台上显示任何输出。但是,当前目录中创建了一个名为logs.txt的文件,其中包含以下文本: 警告:root:此消息将保存在文件中 。
日志消息中的变量数据
往往,您希望在日志消息中包含一个或多个变量的值,以更深入地了解错误产生的原因,尤其是在应用程序运行时生成错误时。为了实现这一点,可以使用动态字符串格式化技术,例如str类的format()方法或f-strings。
示例
import logging
logging.basicConfig(level=logging.DEBUG)
marks = 120
logging.error("Invalid marks:{} Marks must be between 0 to 100".format(marks))
subjects = ["Phy", "Maths"]
logging.warning("Number of subjects: {}. Should be at least three".format(len(subjects)))
它将产生以下输出。
ERROR:root:Invalid marks:120 Marks must be between 0 to 100
WARNING:root:Number of subjects: 2. Should be at least three