🐍Python 工程与虚拟环境

日志 logging 与调试

面试回答

常见问法

  • printlogging 的区别是什么?
  • 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 检索
  • 上下文注入:通过 LogRecordextracontextvars
  • 库 vs 应用:库只 getLogger,不配 handler;应用在启动时统一配置

易错点

  • 库里调用 basicConfigaddHandler,污染应用配置
  • 没设 propagate,消息消失或重复
  • 用 f-string 做日志,低级别也强制算字符串
  • 日志里打敏感信息(token、密码、身份证号)

记忆技巧

  • 四件套:Logger / Handler / Formatter / Filter
  • 层级口诀:库只拿 logger,应用统一配
  • 性能口诀:日志用 %s 延迟格式化,别用 f-string