ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Django日志配置与ORM性能优化实战

Django日志配置与ORM性能优化实战 1. Django日志配置实战指南在Django项目开发中合理的日志配置是保证系统可维护性的关键。很多开发者习惯用print()调试但当项目上线后完善的日志系统能帮你快速定位线上问题。下面我将分享一套经过生产环境验证的日志配置方案。1.1 基础日志配置在settings.py中添加以下配置这是Django日志系统的基础骨架LOGGING { version: 1, disable_existing_loggers: False, formatters: { verbose: { format: {levelname} {asctime} {module} {process:d} {thread:d} {message}, style: {, }, simple: { format: {levelname} {message}, style: {, }, }, handlers: { console: { class: logging.StreamHandler, formatter: simple }, }, root: { handlers: [console], level: INFO, } }这个配置实现了定义两种日志格式verbose详细和simple简单配置一个控制台输出处理器设置根日志级别为INFO注意disable_existing_loggers设为False很重要否则会禁用Django内置的日志器1.2 分模块日志配置对于大型项目我们需要对不同模块采用不同的日志策略LOGGING[loggers] { django: { handlers: [console], level: INFO, propagate: False, }, myapp: { handlers: [console], level: DEBUG, propagate: True, }, django.db.backends: { handlers: [console], level: DEBUG if DEBUG else INFO, propagate: False, } }这样配置后Django核心模块日志级别为INFO你的应用模块(myapp)日志级别为DEBUG数据库相关日志在DEBUG模式下会显示SQL语句1.3 文件日志与轮转生产环境需要将日志持久化到文件并设置合理的轮转策略LOGGING[handlers][file] { level: INFO, class: logging.handlers.RotatingFileHandler, filename: /var/log/myapp.log, maxBytes: 1024*1024*5, # 5MB backupCount: 5, formatter: verbose } LOGGING[root][handlers].append(file)关键参数说明maxBytes单个日志文件最大大小backupCount保留的日志文件备份数量生产环境建议将日志目录设为/var/log/2. Django调试工具栏深度优化Django Debug Toolbar是开发阶段的利器但配置不当会影响性能。以下是优化建议2.1 基础配置安装后在settings.py中添加INSTALLED_APPS [debug_toolbar] MIDDLEWARE.insert(0, debug_toolbar.middleware.DebugToolbarMiddleware) INTERNAL_IPS [127.0.0.1]2.2 性能优化配置DEBUG_TOOLBAR_CONFIG { SHOW_TOOLBAR_CALLBACK: lambda request: DEBUG, RESULTS_CACHE_SIZE: 10, SQL_WARNING_THRESHOLD: 500, # 毫秒 DISABLE_PANELS: { debug_toolbar.panels.redirects.RedirectsPanel, } }这些配置可以只在DEBUG模式下显示工具栏限制缓存结果数量设置SQL慢查询阈值禁用不常用的面板2.3 实用技巧查看模板渲染时间启用Templates面板分析SQL查询SQL面板可以显示重复查询内存使用分析使用python-memcached或pympler面板生产环境切记移除debug_toolbar否则会暴露敏感信息3. ORM性能优化实战Django ORM使用不当会导致严重的性能问题。以下是关键优化点3.1 查询优化技巧使用select_related和prefetch_related# 差 books Book.objects.all() for book in books: print(book.author.name) # 每次循环都会查询数据库 # 优 books Book.objects.select_related(author).all()只获取需要的字段# 差 books Book.objects.all() # 获取所有字段 # 优 books Book.objects.only(title, author__name)使用values()/values_list()获取字典/元组# 当只需要部分字段时 books Book.objects.values(id, title)3.2 批量操作批量创建# 差 for item in items: Model.objects.create(**item) # 优 Model.objects.bulk_create([Model(**item) for item in items])批量更新# 单个更新 for obj in queryset: obj.field value obj.save() # 批量更新 queryset.update(fieldvalue)3.3 高级技巧使用annotate替代Python计算# 差 books Book.objects.all() for book in books: book.review_count book.reviews.count() # N1问题 # 优 books Book.objects.annotate(review_countCount(reviews))使用Subquery减少查询次数from django.db.models import Subquery, OuterRef recent Comment.objects.filter( bookOuterRef(pk) ).order_by(-created_at)[:5] books Book.objects.annotate( recent_commentSubquery(recent.values(text)) )4. 常见问题排查手册4.1 日志不生效排查检查LOGGING配置是否在settings.py中确认disable_existing_loggersFalse检查日志文件权限尝试最简单的控制台日志配置测试4.2 ORM性能问题定位使用django-debug-toolbar查看SQL查询检查是否出现N1查询问题使用explain()分析慢查询print(Book.objects.filter(title__containsDjango).explain())4.3 调试工具栏不显示检查INTERNAL_IPS设置确认DEBUGTrue检查中间件顺序查看浏览器控制台是否有错误5. 生产环境最佳实践日志分级策略ERROR级别日志触发告警INFO级别记录关键业务流程DEBUG级别仅在测试环境开启ORM优化检查清单使用select_related/prefetch_related避免在循环中查询数据库使用批量操作替代单个操作定期检查慢查询监控指标数据库查询次数请求响应时间内存使用情况异常日志频率这套配置和优化方案在我们多个百万级用户项目中验证有效特别是在处理高并发请求时合理的日志配置和ORM优化能为系统性能带来显著提升。建议新项目从一开始就采用这些实践避免后期重构带来的额外成本。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进