WMX · 随记
·Python· 3 分钟阅读

logging:把可检索的事件写进日志

大量 print 难以区分级别和模块,也不方便关闭调试信息。日志需要稳定的事件描述与适当的上下文,才能在排查时被检索。

Python 系列概览:输入校验、数据处理与行为验证
Python 系列概览:输入校验、数据处理与行为验证 点击图片查看大图 ↗

问题从哪里出现

大量 print 难以区分级别和模块,也不方便关闭调试信息。日志需要稳定的事件描述与适当的上下文,才能在排查时被检索。

理解核心机制

使用命名 logger 和级别控制输出。logger.info("count=%s", count) 把格式化留到日志系统处理;但传入参数的函数调用仍会先执行。

动手做一个小实验

Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。

Python15 行 · 可横向滚动
import logging
import io
stream = io.StringIO()
logger = logging.getLogger("demo.worker")
logger.setLevel(logging.INFO)
logger.propagate = False
handler = logging.StreamHandler(stream)
logger.addHandler(handler)
try:
    logger.info("batch_finished count=%s", 3)
    assert "count=3" in stream.getvalue()
    print(stream.getvalue().strip())
finally:
    logger.removeHandler(handler)
    handler.close()

适用边界与常见误区

多次安装 handler 会导致重复输出。库代码通常不应替应用配置根 logger;请求内容、令牌和个人信息也不应未经处理直接写日志。

继续练习

分别设置 INFO 与 WARNING,观察输出;再添加代价较高的参数计算,判断何时需要 isEnabledFor。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档