Z
ZHANK
测试与工程化

日志系统 Logging

Logger/Handler/Formatter 架构、级别过滤、文件/控制台输出

日志系统 Logging

print() 调试只在开发时用——生产环境用 logging 模块,按级别输出、写文件、发告警。

学完本章你将: 掌握 Logger/Handler/Formatter、级别过滤、文件输出。


基本配置

python
import logging

# 快速配置
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
    handlers=[
        logging.FileHandler("app.log", encoding="utf-8"),
        logging.StreamHandler(),  # 同时输出到控制台
    ]
)

logger = logging.getLogger(__name__)

logger.debug("调试信息")    # 不显示(级别低于 INFO)
logger.info("用户登录")      # 显示
logger.warning("磁盘空间不足")
logger.error("数据库连接失败")
logger.critical("系统崩溃")

日志级别

DEBUG < INFO < WARNING < ERROR < CRITICAL

设置级别后,只输出 ≥ 该级别的日志

Logger / Handler / Formatter 架构

python
# 1. 创建 Logger
logger = logging.getLogger("myapp")
logger.setLevel(logging.DEBUG)

# 2. 创建 Handler(输出到哪里)
file_handler = logging.FileHandler("app.log")
file_handler.setLevel(logging.WARNING)  # 只写 WARNING 以上到文件

console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)

# 3. 设置格式
formatter = logging.Formatter(
    "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)

# 4. 组合
logger.addHandler(file_handler)
logger.addHandler(console_handler)

最佳实践

python
# ✅ 用 __name__ 作为 logger 名(自动对应模块层级)
logger = logging.getLogger(__name__)

# ✅ 库代码只创建 logger,不配置 handler
# ❌ 库代码不要用 basicConfig——会覆盖用户配置

# ✅ 记录异常堆栈
try:
    risky()
except Exception:
    logger.exception("操作失败")  # 自动附带堆栈