文章目录日志不是 print——Python logging 模块的生产级用法导入语1 ~ logging 模块的四层架构1.1 基础使用2 ~ Django 项目中的日志配置3 ~ 日志轮转——别让日志文件塞满磁盘4 ~ 结构化日志——JSON 格式输出思考 总结结尾日志不是 print——Python logging 模块的生产级用法文章简介大部分 Django 新手写日志的方式是print(f用户 {user.id} 登录成功)——在公司项目中这行代码迟早要被替换。print没有日志级别、没有时间戳、不能按模块过滤、不能输出到文件或外部日志系统。本文从 logging 模块的四层架构Logger / Handler / Formatter / Filter讲起覆盖 Django 项目的日志配置、日志轮转策略、结构化日志JSON格式输出以及与 ELK 系统的对接。穿插真实事故——因为没有日志导致一个订单丢失问题排查了三天。 个人主页源码骑士❄专栏传送门《Android开发基础》《python基础课程》⭐️热衷从源码视角拆解技术底层原理将复杂架构讲得通俗易懂 源码骑士的简介5年Android Framework系统开发经验曾主导多项系统级性能优化专项技术栈覆盖Android系统全链路Binder/Handler/AMS/WMS/启动流程及Java后端全家桶Spring MyBatis Redis Oracle累计产出原创技术文章100篇文章以源码拆解为特色被读者评价为看一篇胜过啃一周文档导入语2020 年一个电商系统出现了一个 Bug——顾客支付了但订单状态没更新。DBA 查了数据库发现某笔订单的 UPDATE 语句没执行。但我们不知道为什么没执行——因为那段代码里只有一行print(更新订单)而线上 Gunicorn 的 stdout 被重定向到了 Docker 日志——容器重启后全没了。从那以后我定了一条规矩所有 Django 项目必须使用 logging 模块print 只能用于本地调试。1 ~ logging 模块的四层架构Logger → Handler → Formatter → 输出目标文件/控制台/ELK Logger 记录日志的入口每个模块一个 Logger Handler 决定日志输出到哪里文件、邮件、HTTP Formatter决定日志的格式时间、模块名、级别、消息 Filter 按条件过滤日志1.1 基础使用importlogging loggerlogging.getLogger(__name__)# 每个模块用自己的 Loggerlogger.debug(调试信息)# 10logger.info(用户 %s 登录成功,user.id)# 20logger.warning(磁盘使用率 85%)# 30logger.error(数据库连接失败)# 40logger.exception(异常信息,exc_infoTrue)# 自动包含堆栈2 ~ Django 项目中的日志配置# settings.pyLOGGING{version:1,disable_existing_loggers:False,# 保留 Django 内置日志formatters:{verbose:{format:{levelname} {asctime} {module} {message},style:{,},json:{format:{time:%(asctime)s,level:%(levelname)s,module:%(module)s,message:%(message)s},},},handlers:{file:{class:logging.handlers.RotatingFileHandler,filename:/var/log/django/app.log,maxBytes:10*1024*1024,# 10MB 滚动backupCount:5,# 保留 5 个旧日志文件formatter:verbose,},console:{class:logging.StreamHandler,formatter:verbose,},},loggers:{django:{handlers:[file,console],level:INFO,propagate:False,},myapp:{# 你自己的应用handlers:[file],level:DEBUG,},},}3 ~ 日志轮转——别让日志文件塞满磁盘Handler用途RotatingFileHandler按文件大小轮转达到N MB 自动切新文件TimedRotatingFileHandler按时间轮转每天/每小时一个新文件handlers:{daily:{class:logging.handlers.TimedRotatingFileHandler,filename:/var/log/django/app.log,when:midnight,# 每天午夜切新文件backupCount:30,# 保留最近 30 天日志}}4 ~ 结构化日志——JSON 格式输出生产环境推荐用 JSON 格式方便 ELKElasticsearch Logstash Kibana解析importjson_log_formatter LOGGING{formatters:{json:{():json_log_formatter.VerboseJSONFormatter,},},}思考 总结Python logging 三项必备日志分级——DEBUG 只在开发本地打开生产改为 INFOERROR 和 CRITICAL 触发告警。RotatingFileHandler——别让日志文件无限增长。10MB 轮转 保留 5-10 个历史文件。结构化日志——JSON 格式 ELK 分析 可视化告警。print 做不到这些。结尾日志规范到这里讲完。感谢阅读源码骑士 — 源码级拆解从底层看透技术关注跟博主一起从源码视角深耕底层原理❤️点赞让优质内容被更多人看见⭐收藏核心知识点存好随用随查评论分享你的经验或疑问一起交流一键四连别忘了给博主一键四连️寄语print 让你看到当下logging 让你能看到昨天。结语logging 不是 print 的高级版——是运维、排查、告警的基础设施。最后一篇收官——在线图书管理系统从零到上线。一键四连