Python 零基础测开学习 15——logging

EternalRights · 2025年11月19日 · 67 次阅读

前言

        日志是测试开发的基石之一,它能体现一个工程师的严谨性和工程化思维


为什么要学习日志?

        想象一下,你的自动化测试脚本在深更半夜运行失败了。如果你只用 print 来输出信息,那么这些信息在控制台一闪而过,你第二天早上来根本无从查起到底发生了什么。
        日志(logging)就像是程序的 “黑匣子” 或 “行车记录仪”。它可以把程序运行过程中的关键信息(比如:开始打开浏览器、输入了哪个用户名、点击了哪个按钮、出现了什么错误等)按照特定的格式、特定的级别,持久化地记录到一个文件(或数据库)中。这样,无论程序在什么时候出现问题,我们都可以通过查看日志文件来精准定位问题 。


日志的级别

级别 英文 数值 说明 使用场景(比喻)
DEBUG Debug 10 最详细的调试信息 "医生的病历本":记录每一个细节,开发/调试时用。
INFO Info 20 证明一切按预期运行 "工作日报":记录关键步骤,比如"成功登录"、"开始执行测试用例"。
WARNING Warning 30 表明发生了一些意外,但程序还能工作 "交通黄灯":提醒注意,比如"磁盘空间不足"、"版本过旧"。
ERROR Error 40 由于严重问题,某些功能失效了 "车辆故障灯":需要尽快处理,比如"连接数据库失败"、"元素找不到"。
CRITICAL Critical 50 严重错误,程序可能即将崩溃 "飞机引擎失灵":最高级别错误,必须立即处理。

        重要规则:你需要设置日志记录级别。程序只会记录等于或高于你设置级别的日志信息。默认级别是 WARNING。


logging 的简单用法

1.直接把日志打到屏幕上

import logging

logging.debug('这是一条调试信息')
logging.info('这是一条普通信息')
logging.warning('这是一条警告信息')
logging.error('这是一条错误信息')
logging.critical('这是一条严重错误信息')

        运行上面的代码,你会发现控制台只显示后三条。为什么呢?因为默认级别是 WARNING,所以级别更低的 DEBUG 和 INFO 信息被过滤掉了。

2.基础配置,basicConfig

import logging

# 配置日志:设置级别和格式
logging.basicConfig(level=logging.DEBUG,
                 format='%(asctime)s - %(filename)s - %(levelname)s - %(message)s')
logging.info('这是一条配置后的INFO信息')

basicConfig 的关键参数:

  • level:设置日志级别
  • format:设置日志输出的格式,常用的格式符:
    • %(asctime) s:日志创建的时间
    • %(levelname) s:日志级别名称
    • %(message) s:日志信息内容
    • %(filename) s:输出的日志 Python 文件名
    • %(lineno) s:输出日志的代码行号
    • %(funcName) s:输出日志的函数名
  • filename:将日志输出到指定的文件,而不是控制台

filename 示例:将日志写入文件中

import logging

# 配置为将INFO及以上级别的日志写入文件
logging.basicConfig(
    filename='my_automation_test.log', # 日志文件名
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(filename)s[line:%(lineno)d] - %(message)s'
)
logging.info("这条信息会写入到 my_automation_test.log 文件里")

logging 的高级用法

1.四大组件

1.Logger(日志器)

        好比一个公司的部门。我们通过它来记录日志。可以创建多个 Logger(如 getLogger(“ui_test”),getLogger(“api_test”)),方便管理分类

2.Handler(处理器)

        决定日志记录该被送到哪里。比如,是送到控制台(StreamHandler)还是文件(FileHandler),或是按时间分割的文件(TimedRotatingFileHandler)

3.Formatter(格式器)

        决定日志记录的最终输出格式,就是定义我们前面的 format

4.Filter(拦截器)

        提供更精细的过滤控制,平时用的较少,先了解即可

2.标准代码模板

下面这段代码是自动化测试项目的标准配置

import logging
import os
from datetime import datetime

# 1. 创建一个 Logger
logger = logging.getLogger('my_automation_test') # 给logger起个名字
logger.setLevel(logging.DEBUG) # 设置logger捕获的最低级别,通常设到最低DEBUG

# 2. 创建一个 Formatter,定义日志格式
formatter = logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s'
)

# 3. 创建 Handler(这里创建两个:一个写文件,一个打印控制台)

# 3.1 文件 Handler,用于将日志写入文件
# 推荐按时间切割日志文件,避免单个文件过大
log_path = f"./logs/test_log_{datetime.now().strftime('%Y%m%d')}.log"
file_handler = logging.FileHandler(log_path, encoding='utf-8') # 注意设置编码,防止中文乱码
file_handler.setLevel(logging.INFO) # 设置文件handler的级别,INFO及以上才写入文件
file_handler.setFormatter(formatter) # 给handler设置格式

# 3.2 控制台 Handler,用于输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG) # 设置控制台handler的级别,DEBUG及以上都打印
console_handler.setFormatter(formatter)

# 4. 将 Handler 添加到 Logger 上
logger.addHandler(file_handler)
logger.addHandler(console_handler)

# 使用!
logger.info("这是一条INFO信息,会同时出现在控制台和文件里")
logger.debug("这是一条DEBUG信息,只会出现在控制台,因为文件handler级别是INFO")

后记

        上周参加了 ICPC,这周准备并参加了物理考试,外加学校水痘病毒频发,所以技术进度相较放缓了速度。今天之后才重获大量自由支配的时间,因此会提高速度的。🚀

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册