4. Python 环境准备:Python3 安装、虚拟环境搭建、requests/urllib3 库安装、日志库 logging 配置
在编写蓝绿发布门禁的 Health Check 脚本之前,必须建立标准、隔离且可复现的 Python 运行环境。本节将依次完成 Python3 安装验证、虚拟环境创建、核心 HTTP 库安装以及日志系统配置,确保后续脚本开发具备一致的基础设施。
4.1 Python3 安装与版本验证
Health Check 脚本依赖 Python 3.8+ 特性(如 f-string、类型提示)。执行以下命令确认环境:
# 检查 Python 版本
python3 --version
# 预期输出示例
Python 3.9.18
# 检查 pip 是否可用
python3 -m pip --version
⚠ 版本陷阱: 若系统默认 python 指向 Python2,务必使用 python3 命令。部分老旧 CentOS 7 自带 Python 2.7,需通过
yum install python3 或源码编译安装 3.8+。
| 操作系统 | 安装命令 | 验证命令 |
|---|---|---|
| Ubuntu 20.04+ | sudo apt install python3 python3-pip python3-venv |
python3 --version |
| CentOS 7/8 | sudo yum install python3 python3-pip |
python3 --version |
| macOS (Homebrew) | brew install python@3.9 |
python3 --version |
| Windows | 官网下载安装包,勾选"Add Python to PATH" | py --version |
4.2 虚拟环境搭建
虚拟环境隔离项目依赖,避免与系统级 Python 包冲突。蓝绿发布脚本应独立运行在专属虚拟环境中。
4.2.1 创建与激活虚拟环境
# 创建虚拟环境(在项目根目录执行)
python3 -m venv healthcheck_venv
# 激活虚拟环境(Linux/macOS)
source healthcheck_venv/bin/activate
# 激活虚拟环境(Windows PowerShell)
.\healthcheck_venv\Scripts\Activate.ps1
# 激活后提示符变化,显示 (healthcheck_venv)
4.2.2 验证虚拟环境隔离性
# 查看当前 Python 解释器路径
which python3
# 输出应指向虚拟环境内部路径,如 /home/user/project/healthcheck_venv/bin/python3
# 查看已安装包列表(初始应为空或仅有 pip/setuptools)
pip list
💡 最佳实践: 将虚拟环境目录加入
.gitignore,避免提交到版本库。团队成员通过 requirements.txt 重建环境。
4.3 requests / urllib3 库安装
Health Check 脚本需要向目标服务发送 HTTP 请求并解析响应。推荐优先使用 requests 库(基于 urllib3 封装,API 更友好),同时安装 urllib3 作为底层依赖。
4.3.1 安装命令
# 确保虚拟环境已激活
pip install requests urllib3
# 指定版本安装(推荐锁定版本)
pip install requests==2.31.0 urllib3==2.0.4
# 查看已安装版本
pip show requests
pip show urllib3
4.3.2 验证安装
# 快速验证:导入并打印版本
python3 -c "import requests; print(requests.__version__)"
# 输出: 2.31.0
python3 -c "import urllib3; print(urllib3.__version__)"
# 输出: 2.0.4
📌 版本选择说明: requests 2.31.0 修复了 CVE-2023-32681 安全漏洞,urllib3 2.0.x 移除了对 Python 3.6 的支持。若生产环境 Python 版本较低,可降级至 urllib3 1.26.x。
4.4 日志库 logging 配置
Health Check 脚本必须输出结构化日志,用于门禁决策审计和故障排查。Python 标准库 logging 无需额外安装,但需合理配置格式、级别和输出目标。
4.4.1 基础配置模板
import logging
import sys
def setup_logging(log_file="healthcheck.log", level=logging.INFO):
"""
配置日志系统:同时输出到文件和控制台
"""
# 创建 logger
logger = logging.getLogger("HealthCheck")
logger.setLevel(level)
# 日志格式:时间 | 级别 | 模块 | 消息
formatter = logging.Formatter(
fmt="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
# 文件处理器(追加模式)
file_handler = logging.FileHandler(log_file, mode="a", encoding="utf-8")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# 控制台处理器
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
return logger
# 使用示例
logger = setup_logging()
logger.info("Health Check 脚本启动")
logger.warning("响应时间超过阈值: 2.3s")
logger.error("连接目标服务失败: Connection refused")
4.4.2 日志级别与使用场景
| 级别 | 数值 | Health Check 典型场景 |
|---|---|---|
DEBUG |
10 | 记录每次 HTTP 请求的完整 URL、请求头、响应体(调试用) |
INFO |
20 | 服务正常、门禁通过、版本切换成功等常规事件 |
WARNING |
30 | 响应时间接近阈值、重试发生、非关键字段缺失 |
ERROR |
40 | 连接失败、HTTP 5xx、门禁拒绝、脚本异常终止 |
CRITICAL |
50 | 蓝绿发布门禁系统自身故障、配置加载失败 |
4.4.3 日志输出示例
# 控制台输出
2025-03-21 14:30:01 | INFO | HealthCheck | 开始健康检查: http://blue-app:8080/health
2025-03-21 14:30:01 | DEBUG | HealthCheck | 请求头: {"User-Agent": "HealthCheck/1.0"}
2025-03-21 14:30:01 | INFO | HealthCheck | 响应状态: 200 OK, 耗时: 0.32s
2025-03-21 14:30:01 | INFO | HealthCheck | 门禁决策: PASS (所有检查项通过)
# 文件日志(healthcheck.log)相同格式,便于后续日志采集
💡 生产建议: 生产环境建议将日志级别设为
WARNING 以减少磁盘 I/O;调试阶段使用 DEBUG。日志文件应配置轮转(RotatingFileHandler),避免单文件无限增长。
4.5 环境准备清单
完成本节所有步骤后,使用以下清单验证环境完整性:
- Python3 版本:≥ 3.8,可通过
python3 --version确认 - 虚拟环境:已激活,
which python3指向 venv 内部路径 - requests 库:已安装,
python3 -c "import requests"无报错 - urllib3 库:已安装,作为 requests 的底层依赖
- logging 配置:脚本可正常输出带时间戳的日志到文件和控制台
4.6 生成 requirements.txt
锁定依赖版本,确保所有环境一致:
# 生成当前环境的依赖清单
pip freeze > requirements.txt
# 查看生成的 requirements.txt 内容
cat requirements.txt
# 输出示例:
# requests==2.31.0
# urllib3==2.0.4
# certifi==2023.7.22
# charset-normalizer==3.2.0
# idna==3.4
📌 团队协作: 其他成员克隆项目后,执行
pip install -r requirements.txt 即可一键重建完全相同的依赖环境,避免"在我机器上能跑"的问题。