🐍Python 工程与虚拟环境
日志 logging 与调试
面试回答
常见问法
print和logging的区别是什么?- logging 的 Logger、Handler、Formatter、Filter 分别干什么?
- 怎么在多模块项目里正确配置日志?
- 怎么做结构化日志(JSON log)?
回答
待补充:主线是「logging 的四元素 + 层级传播」,强调在应用入口只配一次,模块里用
logging.getLogger(__name__)拿 logger。
追问
- logger 的 propagate 为什么常踩坑?
logger.info('%s', x)和logger.info(f'{x}')性能差异?structlog/loguru比标准库好在哪?- 怎么把 trace_id 注入到每条日志?
原理展开
- 四要素:
Logger:入口,按模块命名,形成树状层级Handler:输出目的地(stdout、文件、HTTP、syslog)Formatter:格式化Filter:过滤器
- 级别:DEBUG < INFO < WARNING < ERROR < CRITICAL
- 层级传播:子 logger 的消息上浮到父 logger
- 结构化日志:JSON 格式,方便 ELK / Loki / Datadog 检索
- 上下文注入:通过
LogRecord的extra或contextvars - 库 vs 应用:库只
getLogger,不配 handler;应用在启动时统一配置
易错点
- 库里调用
basicConfig或addHandler,污染应用配置 - 没设 propagate,消息消失或重复
- 用 f-string 做日志,低级别也强制算字符串
- 日志里打敏感信息(token、密码、身份证号)
记忆技巧
- 四件套:Logger / Handler / Formatter / Filter
- 层级口诀:库只拿 logger,应用统一配
- 性能口诀:日志用
%s延迟格式化,别用 f-string