news 2026/8/16 11:12:33

Django 用 Loguru 完美替换标准 Logging,实现优雅的日志管理方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Django 用 Loguru 完美替换标准 Logging,实现优雅的日志管理方案

Django 用 Loguru 完美替换标准 Logging,实现优雅的日志管理方案

这篇文章将详细拆解如何将强大的loguru库深度集成到 Django 项目中,彻底解决原生logging配置冗长、难以维护的痛点。


为什么要进行方案替换

Django 默认的日志配置通过LOGGING字典实现,嵌套层级多且语法繁琐。相比之下,loguru提供了更直观的 API 和自动化的日志轮转管理。

核心技术要点

  • 全量拦截:通过自定义InterceptHandler类,将 Django 内置、Gunicorn 容器以及第三方库产生的标准logging消息全部重定向至loguru

  • 精准溯源:利用sys._getframe动态查找调用栈,确保日志中显示的文件名和行号是真实的业务逻辑位置,而非拦截器本身。

  • 自动化策略:配置文件输出时,只需一行代码即可实现凌晨定时切割日志(rotation)和 30 天自动清理(retention)。

  • 并发安全:开启enqueue=True选项,利用多线程/进程安全的队列机制,防止高并发下日志写入冲突。

部署实践:一键接管 Django 日志

在项目中创建日志工具模块后,只需在settings.py顶部导入,并设置LOGGING_CONFIG = None即可禁用 Django 原生逻辑。

Python

import os import sys import logging from pathlib import Path from loguru import logger # 路径初始化 BASE_DIR = Path(__file__).resolve().parent.parent log_dir = os.path.join(BASE_DIR, "logs") log_file_path = os.path.join(log_dir, "dt_test.log") if not os.path.exists(log_dir): os.makedirs(log_dir) # 拦截器定义:核心在于深度(depth)的计算 class InterceptHandler(logging.Handler): def emit(self, record): try: level = logger.level(record.levelname).name except ValueError: level = record.levelno frame, depth = sys._getframe(6), 6 while frame and frame.f_code.co_filename == logging.__file__: frame = frame.f_back depth += 1 logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage()) # 彻底接管配置 LOGGING_CONFIG = None def setup_loguru(debug_mode: bool = True): logger.remove() log_format = "{time:YYYY-MM-DD HH:mm:ss,SSS} | {level: <8} | {name} [{module}.{function}:{line}] | {message}" # 控制台调试输出 if debug_mode: logger.add(sys.stdout, level="DEBUG", format=log_format, enqueue=True) # 文件持久化配置:支持每天凌晨切割与压缩 logger.add( log_file_path, level="DEBUG", format=log_format, rotation="00:00", retention="30 days", encoding="utf-8", enqueue=True, compression="zip" ) # 重定向系统级日志 logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True) for name in ["django", "django.server", "gunicorn.access", "gunicorn.error"]: _log = logging.getLogger(name) _log.handlers = [InterceptHandler()] _log.propagate = False setup_loguru()

放在settings.py顶部或者原来日志配置信息全部删除后的地方

效果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/7 8:41:16

【CTF Writeup】Crypto题型之AES加密算法破解与实战

前言 一、AES-CBC模式原理 AES-CBC模式需满足&#xff1a; 加密前需对明文进行分组&#xff08;每组16字节&#xff09;&#xff0c;不足则填充&#xff1b; 需要一个密钥key&#xff08;16/24/32字节&#xff0c;对应AES-128/192/256&#xff09;和初始化向量IV&#xff08…

作者头像 李华
网站建设 2026/8/9 23:41:52

2000亿美元!2026年全球游戏行业的新格局与新变量

2000亿美元&#xff01;2026年全球游戏行业的新格局与新变量 2026年&#xff0c;全球游戏市场规模预计突破2000亿美元&#xff08;约2050-2100亿美元&#xff09;&#xff0c;从2025年的1888-1970亿美元增长3-7%。 这标志着后疫情低迷期的复苏&#xff08;增长率从2022-2024的…

作者头像 李华
网站建设 2026/8/9 19:58:34

鸿蒙APP开发从入门到精通:ArkUI组件库详解与常用组件实战

鸿蒙APP开发从入门到精通&#xff1a;ArkUI组件库详解与常用组件实战 鸿蒙&#xff08;HarmonyOS NEXT&#xff09;是华为推出的分布式操作系统&#xff0c;其APP开发框架以ArkUI为核心&#xff0c;采用ArkTS&#xff08;基于TypeScript的扩展语言&#xff09;进行声明式开发。…

作者头像 李华
网站建设 2026/8/13 22:04:03

Router_T000_ConceptMECE

startmindmap* 汇报总图** 动机价值*** 故事钩子*** 价值主张** 现状基线*** 基线速览*** SafeDreamer*** UNISafe外盾*** SPOWL** 问题缺陷*** 主流缺陷*** OOD幻觉*** 外盾不学*** 固定阈值** 创新方案*** 核心创新*** Risk-Bellman*** ucert内生*** 不改环境奖*** 插入点** …

作者头像 李华
网站建设 2026/8/14 12:48:00

Java计算机毕设之基于springboot+vue的游戏装备账号销售商城平台系统基于springboot的游戏售卖商城系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华