Python 日志 logging 入门:从 print 到分级日志

举报
yd_278701352 发表于 2026/11/07 00:33:32 2026/11/07
【摘要】 Python 日志 logging 入门:从 print 到分级日志很多 Python 初学者排查问题靠 print,程序一上生产就抓瞎:日志散落在各处,没有时间戳,分不清哪句是报错、哪句只是调试信息。标准库 logging 模块就是为了解决这个问题而生的,学会它只需要理解三个概念:级别、Logger、Handler。 五个级别,用错了等于没记logging 内置五个级别,从低到高依次是 ...

Python 日志 logging 入门:从 print 到分级日志

很多 Python 初学者排查问题靠 print,程序一上生产就抓瞎:日志散落在各处,没有时间戳,分不清哪句是报错、哪句只是调试信息。标准库 logging 模块就是为了解决这个问题而生的,学会它只需要理解三个概念:级别、Logger、Handler。

五个级别,用错了等于没记

logging 内置五个级别,从低到高依次是 DEBUG、INFO、WARNING、ERROR、CRITICAL。默认只输出 WARNING 及以上,所以新手常遇到"明明写了 logging.info,怎么什么都没打印"的困惑——不是代码错了,是级别被默认阈值拦住了。

一个简单的分级习惯:开发调试用 DEBUG,记录程序正常推进的关键节点用 INFO,遇到可恢复的异常用 WARNING,捕获到错误用 ERROR,服务不可用才用 CRITICAL。级别不是摆设,它决定了你在海量日志里能不能一眼定位问题。

三行代码,先跑起来

import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
)
log = logging.getLogger(__name__)

log.info("服务启动,监听 8080 端口")
log.warning("磁盘使用率已达 85%")

basicConfig 一次配置全局生效,format 里的 %(asctime)s 是时间,%(levelname)s 是级别,%(name)s 是模块名。建议每个模块都用 getLogger(__name__),出了问题能立刻定位到文件。

日志也要分流:控制台与文件各司其职

开发时看控制台就够了,但生产环境需要落盘。logging 的 Handler 就是干这个的:一个 Handler 管一个去向。

import logging

logger = logging.getLogger("app")
logger.setLevel(logging.DEBUG)

console = logging.StreamHandler()
console.setLevel(logging.INFO)

file_handler = logging.FileHandler("app.log", encoding="utf-8")
file_handler.setLevel(logging.DEBUG)

formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s")
console.setFormatter(formatter)
file_handler.setFormatter(formatter)

logger.addHandler(console)
logger.addHandler(file_handler)

这段配置的效果是:控制台只看 INFO 以上,文件里保留全部 DEBUG 细节。排查线上问题时,文件里的 DEBUG 就是你的时间机器。

三个常见坑

第一,不要在循环里调 basicConfig。它只在第一次调用时生效,后面再调会被静默忽略,改了配置却不见效就是这个原因。

第二,不要用根 Logger 到处打日志。直接 logging.info(...) 用的是根 Logger,大项目里多个模块混在一起分不清来源。每个模块 getLogger(__name__) 是基本纪律。

第三,异常要带上堆栈。捕获异常后只写 log.error("出错了") 等于没记,正确姿势是 log.exception("处理订单失败"),它会自动把完整堆栈附在日志后面,定位时间能省一半。

从 print 迁移,只需记住一句话

print 是给人看的,logging 是给未来的自己和运维看的。把调试信息交给 DEBUG、把运行状态交给 INFO、把故障现场交给 exception,等程序规模上来,你会感谢今天这个决定。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。