Python-日志记录


术语“日志记录”是指记录某个流程中不同中间事件的机制。在软件应用程序中记录日志有助于开发人员调试和跟踪应用程序逻辑中的任何错误。Python 的标准库包含日志记录模块,可以使用该模块生成和记录应用程序日志。

在程序中间歇性地使用 print() 语句来检查不同变量和对象的中间值是一种常见的做法。它可以帮助开发人员验证程序是否按预期运行。然而,日志记录比间歇性打印语句更有益,因为它可以更深入地了解事件。

记录级别

日志记录的重要功能之一是您可以生成不同严重级别的日志消息。日志记录模块定义以下级别及其值。

等级 当它被使用时 价值

调试

详细信息,通常仅在诊断问题时才有意义。

10

信息

确认事情按预期进行。

20

警告

表明发生了意外情况,或表明在不久的将来会出现某些问题(例如“磁盘空间不足”)。该软件仍然按预期工作。

30

错误

由于更严重的问题,该软件已无法执行某些功能。

40

批判的

严重错误,说明程序本身可能无法继续运行。

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

请注意,此处仅显示 WARNING 级别之后的日志消息。这是因为 root - 默认记录器会忽略高于“警告”严重级别的所有严重级别。请注意,严重性级别记录在每行的第一个冒号 (:) 之前。同样,root是LogRecord中显示的记录器的名称。

日志记录配置

程序生成的日志可以使用BasicConfig()方法进行定制。您可以定义以下一个或多个参数进行配置 -

  • filename - 指定使用指定的文件名创建 FileHandler,而不是 StreamHandler。

  • filemode - 如果指定了文件名,则以此模式打开文件。默认为“a”。

  • datefmt - 使用指定的日期/时间格式,由 time.strftime() 接受。

  • style - 如果指定了格式,则使用此样式作为格式字符串。'%'、'{' 或 '$' 之一分别表示 printf 样式、str.format() 或 string.Template。默认为“%”。

  • level - 将根记录器级别设置为指定级别。

  • 错误- 如果此关键字参数与文件名一起指定,则在创建 FileHandler 时使用其值,从而在打开输出文件时使用。如果未指定,则使用值“backslashreplace”。请注意,如果指定 None,它将被传递给 open(),这意味着它将被视为与传递“错误”相同。

例子

要记录 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 文件,其中包含文本WARNING:root:This message will be save to a file in that。

记录消息中的可变数据

通常,您希望在日志消息中包含一个或多个变量的值,以便更深入地了解原因,尤其是应用程序运行时生成的错误的原因。为此,可以使用任何动态字符串格式化技术,例如str类的 format() 方法或 f-string。

例子

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