写脚本跑着跑着出错了?临时加个 print 查问题,结果一运行满屏都是调试信息,关又不敢全关,留着又眼花——这场景是不是很熟?其实 Python 标准库里早就给你备好了更稳、更灵活的日志记录功能,不用装第三方包,直接就能用。
log 是啥?不是“记流水账”那么简单
日志不是单纯把信息打出来,而是分等级、可开关、能定向输出的记录方式。比如:程序启动算 INFO,用户登录成功是 INFO,密码输错三次就该记成 WARNING,数据库连不上就得标上 ERROR。不同级别,你随时可以调整显示或不显示,再也不用反复删 print。
三行代码,立刻上手
打开编辑器,试试这段:
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logging.info('程序开始运行')
logging.warning('配置文件缺失,将使用默认设置')
logging.error('连接数据库失败')运行后你会看到类似这样的输出:
2024-06-12 10:23:45,123 - INFO - 程序开始运行
2024-06-12 10:23:45,124 - WARNING - 配置文件缺失,将使用默认设置
2024-06-12 10:23:45,124 - ERROR - 连接数据库失败时间、级别、消息全齐,格式清晰,一眼就能定位问题在哪。
想把日志存到文件?加个参数就行
把 basicConfig 改一下:
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='app.log',
filemode='a'
)这样所有日志就默默写进 app.log 里了,控制台反而干干净净。适合部署在服务器上长期跑的脚本,半夜出问题,早上翻日志就知道发生了啥。
多个模块?用 logger 分开管
大一点的项目常分模块,比如 user.py 和 db.py。别全用 logging.xxx,改用带名字的 logger:
# user.py
logger = logging.getLogger('user')
logger.info('用户张三已登录')# db.py
logger = logging.getLogger('db')
logger.error('查询用户列表超时')配合前面的 %(name)s 格式,日志里自动带上模块名,排查时再也不用猜“这行是谁打的”。
小提醒:别在生产环境用 DEBUG 级别狂打日志
开发时设 level=logging.DEBUG 没问题,但上线后建议调成 WARNING 或 ERROR。不然几小时下来日志文件涨到几百MB,磁盘报警不说,查问题也像大海捞针。
标准库的日志功能,不炫技、不折腾,就是老老实实帮你把事情记清楚。下次再想敲 print('debug...'),不妨停半秒,换成 logging.debug(...) —— 多敲两个字母,省下三天排错时间。