在Python自动化测试(尤其是接口自动化)和日常开发中,日志是定位问题、跟踪程序运行状态的核心工具。

logging作为Python标准库中的内置模块,无需额外安装,即可提供灵活、强大的日志记录功能,既能输出日志到控制台,也能写入文件,还支持自定义日志级别和输出格式,完全满足不同场景下的日志需求。

一、logging模块核心介绍

logging是Python标准库中的一个模块,它提供了灵活的日志记录功能。

与print语句相比,logging的优势在于可控制日志级别、可自定义输出格式、可持久化到文件,更适合大型项目和自动化测试场景。

二、日志级别

logging模块定义了5个不同级别的日志,优先级从低到高依次为:DEBUG < INFO < WARNING < ERROR < CRITICAL

核心规则:当设置某个日志级别后,只有高于或等于该级别的日志会被记录和输出,低于该级别的日志会被忽略。

  • DEBUG:调试信息,用于开发过程中定位代码细节,比如变量赋值、函数调用等,通常在开发阶段使用。

  • INFO:普通信息,用于告知程序正常运行状态,比如“程序启动成功”“接口请求完成”等。

  • WARNING:警告信息,提示程序可能存在潜在问题,但不影响程序继续运行,比如“参数未传入,使用默认值”。

  • ERROR:错误信息,程序出现错误,部分功能无法正常执行,比如“接口请求失败”“文件读取失败”。

  • CRITICAL:严重错误信息,程序出现致命错误,无法继续运行,比如“数据库连接失败”“核心函数报错”。

三、基础使用:全局logging

logging模块默认只输出WARNING及以上级别的日志,若需输出更低级别的日志(如INFO、DEBUG),需通过basicConfig()方法指定日志级别。

import logging
print("默认情况下,logging只输出warning及以上级别的日志")

#指定输出级别,输出info及以上级别日志
# logging.basicConfig(level=logging.INFO)

logging.debug("this is a debug message")
logging.info("this is a info message")
logging.warning("this is a warning message")
logging.error("this is a error message")
logging.critical("this is a critical message")

指定日志级别为INFO:
 

import logging
print("默认情况下,logging只输出warning及以上级别的日志")

#指定输出级别,输出info及以上级别日志
logging.basicConfig(level=logging.INFO)

logging.debug("this is a debug message")
logging.info("this is a info message")
logging.warning("this is a warning message")
logging.error("this is a error message")
logging.critical("this is a critical message")

代码说明:

  • 导入logging模块后,默认日志级别为WARNING,因此DEBUG和INFO级别的日志不会输出。

  • 通过logging.basicConfig(level=logging.INFO)将日志级别设置为INFO,此时INFO、WARNING、ERROR、CRITICAL级别的日志都会被输出,DEBUG级别仍被忽略。

四、自定义logger

全局logging适合简单场景,在自动化测试或大型项目中,更推荐使用自定义logger。

自定义logger可以灵活配置日志级别、输出目标(文件/控制台)、日志格式,还能区分不同模块的日志,便于问题定位。

import logging
logger = logging.getLogger("my_logger")
#给logger对象配置自己的日志级别
logger.setLevel(level=logging.DEBUG)

#创建文件处理器--将日志输出到mylog.log文件(没有则会自动创建)
handler = logging.FileHandler(filename="mylog.log")

# 创建⼀个⽇志格式器对象
formatter = logging.Formatter(
    "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d)] - %(message)s"
)
#将格式器设置到处理器上
handler.setFormatter(formatter)

#将文件处理器添加到日志记录器中
logger.addHandler(handler)

logger.debug("this is a debug message")
logger.info("this is a info message")
logger.warning("this is a warning message")
logger.error("this is a error message")
logger.critical("this is a critical message");
代码逐行解析(结合课件知识点)
  1. 创建自定义logger对象:logger = logging.getLogger("my_logger")

    1. getLogger()方法用于获取一个日志记录器对象,括号内的参数是logger的名称(此处命名为"my_logger")。

    2. 若使用logging.getLogger(__name__),则logger名称为当前模块名称,有助于在大型项目中区分不同模块的日志,两种命名方式均可,根据场景选择。

  2. 设置logger日志级别:logger.setLevel(level=logging.DEBUG)

    1. 将logger的日志级别设置为DEBUG,意味着所有DEBUG及以上级别的日志都会被记录(包括DEBUG、INFO、WARNING、ERROR、CRITICAL)。

    2. 注意:logger的级别优先级高于后面的处理器级别,若logger级别设置为INFO,即使处理器级别为DEBUG,也只会记录INFO及以上级别日志。

  3. 创建文件处理器:handler = logging.FileHandler(filename="mylog.log")

    1. FileHandler是logging模块中的文件处理器,用于将日志信息写入指定文件。

    2. 若指定的文件(此处为mylog.log)不存在,程序会自动创建该文件;若文件已存在,新的日志会追加到文件末尾,不会清空原有内容。

  4. 创建日志格式器并绑定到处理器:

    1. formatter = logging.Formatter("格式字符串"):创建格式器对象,定义日志的输出格式。

    2. handler.setFormatter(formatter):将格式器绑定到文件处理器,确保写入文件的日志按照指定格式显示。

  5. 将处理器添加到logger:logger.addHandler(handler)

    1. logger本身不具备输出日志的功能,必须添加处理器(如FileHandler、StreamHandler),才能将日志输出到指定目标(文件、控制台)。

    2. 若需要同时输出日志到控制台和文件,可再创建一个StreamHandler(控制台处理器),同样添加到logger中。

  6. 输出不同级别日志:通过logger.debug()、logger.info()等方法输出对应级别的日志,这些日志会按照指定格式写入mylog.log文件中。

日志占位符信息:

格式占位符

说明

%(asctime)s

日志记录的时间戳,默认格式为“年-月-日 时:分:秒,毫秒”,可自定义时间格式。

%(levelname)s

日志级别(如DEBUG、INFO、WARNING、ERROR、CRITICAL),清晰区分日志重要程度。

%(name)s

日志记录器的名称(此处为"my_logger"),用于区分不同logger的日志。

%(filename)s

日志记录发生的文件名(如我的练习代码中,文件名是test_jsonschema.py)。

%(funcName)s

日志记录发生的函数名,若日志在函数外输出,则显示为<module>。

%(lineno)d

日志记录发生的行号,整数格式,便于快速定位代码中的日志输出位置。

%(message)s

日志消息本身,即logger.debug()、logger.info()等方法中传入的字符串。

上面代码中使用的格式字符串,会让日志输出如下格式(示例):

这种格式包含了时间、级别、logger名称、文件名、行号和日志消息,能快速定位问题,是自动化测试中最常用的日志格式。

七、总结

logging模块是Python自动化测试和开发中不可或缺的工具,其核心优势在于灵活可控、功能强大。

在接口自动化测试中,可在接口请求前、请求后输出日志,记录请求参数、响应结果、请求状态等,便于接口失败时定位问题,例如在发送接口请求后输出INFO级日志,接口报错时输出ERROR级日志。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐