
线上问题排查,日志是第一手线索。Python 项目中,日志写得不规范、不完整,或者关键信息缺失,会让定位问题变成“盲人摸象”。真正有效的日志,不是越多越好,而是该有的上下文都有、能还原执行路径、带可追溯标识、且不影响性能。
日志必须包含唯一请求 ID
微服务或 Web 应用中,一次用户操作可能横跨多个模块甚至多个服务。没有统一的请求 ID,日志就散落在各处,无法串联。建议在入口(如 Flask 的 before_request 或 Django 的中间件)生成 UUID 或短 ID,并注入到 logging 的 LoggerAdapter 或 Filter 中,让每条日志自动带上 request_id 字段。
- 避免手动在每个 log.info() 里拼接 request_id —— 易漏、难维护
- 使用 logging.Filter 是更干净的做法:重写
filter(record)方法,动态给 record 添加属性 - 配合 structured logging(如使用 structlog 或 loguru),可直接输出 JSON,方便 ELK 或 Loki 检索
异常日志要带完整 traceback 和上下文变量
只记录 except Exception as e: logger.error(str(e)) 是典型反模式。它丢失了堆栈、局部变量、入参等关键信息,根本无法复现。
- 一律用
logger.exception("描述性消息")或logger.error("...", exc_info=True) - 在捕获异常时,主动记录关键业务变量(如 user_id、order_no、input_data),但注意脱敏,避免打印密码、token、身份证号等
- 对异步任务(Celery/asyncio),确保异常被捕获并记录到主线程日志,而不是被静默吞掉
区分日志级别,避免 INFO 泛滥
生产环境 INFO 级别日志如果包含大量高频、无区分度的内容(比如“收到请求”、“进入函数”),会快速淹没真正有价值的线索,还拖慢 I/O。
在线证件照系统是一套完善的冲印行业解决方案,致力于解决用户线上拍摄证件照,拍摄最美最标准证件照的使命。证件照免费版功能:后台统计:当天制作、当天新增、支持规格、近7日统计规格列表:筛选查看、编辑用户列表:筛选查看常见问题:筛选查看、新增、编辑、删除小程序设置:应用设置、流量主设置小程序跳转:筛选查看、新增、编辑、删除关注公众号:引导设置系统要求:系统:Linux系统(centos x64)运行环境
立即学习“Python免费学习笔记(深入)”;
- DEBUG:仅开启调试时用,本地或预发环境启用;生产默认关闭
- INFO:记录有业务意义的状态节点,如“订单创建成功(id=12345)”、“缓存刷新完成(key=user_789)”
- WARNING:记录非错误但需关注的情况,如降级触发、重试第 2 次、HTTP 调用超时但兜底成功
- ERROR/CRITICAL:只用于真正影响功能的异常,且必须可行动 —— 看到这条日志,应该知道下一步查什么
日志输出要结构化、可检索、有时区
纯文本日志在日志平台中搜索困难,尤其当字段混在一起时。时间戳没时区也会导致跨地域服务时间对不上。
- 用 %(asctime)s 格式化时,设置
datefmt='%Y-%m-%d %H:%M:%S.%f%z'并配置logging.basicConfig(..., force=True)确保生效 - 推荐用 loguru:开箱支持结构化 JSON 输出、自动异常回溯、线程/进程安全、无需 handler 配置
- 关键字段(如 service_name、env、host、trace_id)应作为 extra 传入,不要硬编码进 msg 字符串
不复杂但容易忽略:上线前跑一次日志采样检查 —— 模拟真实请求,看几条典型日志是否含 request_id、时间是否带时区、ERROR 是否带 traceback、敏感字段是否已过滤。这一步花 5 分钟,能省下几小时排查时间。









