日志系统 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("操作失败") # 自动附带堆栈