😵
print()
调试虽然方便,但混在生产代码里简直灾难。 今天教你用 Python 的logging
模块写一个可控、可分级、可记录文件的日志系统,干净又专业!
✅ 本文目标
- 理解
logging
模块的等级体系 - 实现控制台 + 文件双通道日志记录
- 使用格式化输出 + 时间戳
- 在项目中封装一个通用日志器
📦 一、什么是 logging 模块?
Python 自带的 logging
是标准日志库,可以:
功能 | 用途 |
---|---|
分级别日志(DEBUG/INFO/WARNING/ERROR/CRITICAL) | 适配开发、测试、线上 |
控制输出位置(console、文件、远程服务器) | 多场景支持 |
支持时间戳、格式模板、模块名等丰富信息 | 有利于排查问题 |
🧪 二、最基础的用法:只打 INFO 级别以上
python
import logging
logging.basicConfig(level=logging.INFO)
logging.info("程序启动")
logging.debug("调试信息") # 默认不会打印
logging.warning("这是个警告")
logging.error("出现了错误")
输出:


🎯 三、自定义日志格式 + 写入文件
python
import logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s | %(levelname)s | %(message)s",
filename="log.txt",
filemode="a", # 追加模式
encoding="utf-8"
)
logging.info("启动任务")
logging.error("失败了但我不慌")
输出到 log.txt
:

🔧 四、同时输出到控制台 + 文件(进阶推荐)
python
import logging
logger = logging.getLogger("my_logger")
logger.setLevel(logging.DEBUG)
# 控制台输出
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 文件输出
file_handler = logging.FileHandler("run.log", encoding="utf-8")
file_handler.setLevel(logging.DEBUG)
# 日志格式
formatter = logging.Formatter(
fmt="%(asctime)s | %(levelname)s | %(name)s | %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logger.addHandler(file_handler)
使用:
python
logger.info("程序启动")
logger.debug("这个 debug 只写入文件")
logger.error("严重错误")

🧰 五、封装成可复用模块 logger.py
python
# logger.py
import logging
def get_logger(name="app", logfile="app.log"):
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
if not logger.handlers:
formatter = logging.Formatter(
"%(asctime)s | %(levelname)s | %(name)s | %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
ch.setFormatter(formatter)
fh = logging.FileHandler(logfile, encoding="utf-8")
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
logger.addHandler(ch)
logger.addHandler(fh)
return logger
使用方式:
python
# main.py
from logger import get_logger
log = get_logger("spider")
log.info("开始爬虫任务")
log.warning("页面结构有变")
log.debug("内部状态 x=42")
log.error("请求失败,重试中")
💡 BONUS:结合异常 + 日志
python
try:
1 / 0
except Exception as e:
log.exception("❌ 除法出错了")
输出自动带有完整异常堆栈。
🧠 总结一句话
print()
只属于临时调试,而logging
是工程化思维的体现:可控、可分析、可复盘。