logging:把可检索的事件写进日志
大量 print 难以区分级别和模块,也不方便关闭调试信息。日志需要稳定的事件描述与适当的上下文,才能在排查时被检索。
问题从哪里出现
大量 print 难以区分级别和模块,也不方便关闭调试信息。日志需要稳定的事件描述与适当的上下文,才能在排查时被检索。
理解核心机制
使用命名 logger 和级别控制输出。logger.info("count=%s", count) 把格式化留到日志系统处理;但传入参数的函数调用仍会先执行。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。
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。