Django日志配置问题:ERROR级日志无法写入debug.log文件排查
Django日志配置问题排查
核心故障点
- 未明确配置
django.request、django.security等Django内置子logger的传播规则:Django运行时的请求异常、500错误、安全类告警都会输出到这两类子logger,虽然默认日志传播属性为True,但部分部署容器(Gunicorn、uWSGI等)会默认关闭这类子logger的传播,导致错误日志无法传递到django根logger的file handler。 - file handler配置不全:未指定日志格式化器与文件编码,部分环境下无格式化器会导致日志写入失败,中文日志也会因为编码问题无法写入文件。
- 未覆盖全局异常日志:Python解释器层面的未捕获异常不会进入Django的
django.*日志体系,没有专门配置捕获这部分日志的规则。 - 若你提到的是Django启动阶段的语法/编译错误,这类错误在Django日志体系初始化前抛出,无法被该配置捕获,需要查看部署容器的自身日志输出。
修复后的完整LOGGING配置
LOGGING = { "version": 1, "disable_existing_loggers": False, "filters": { "require_debug_false": {"()": "django.utils.log.RequireDebugFalse"}, "require_debug_true": {"()": "django.utils.log.RequireDebugTrue"}, }, "formatters": { "django.server": { "()": "django.utils.log.ServerFormatter", "format": "[{server_time}] {message}", "style": "{", }, # 新增普通日志格式化器 "standard": { "format": "[{asctime}] [{levelname}] [{module}] {message}", "style": "{", "datefmt": "%Y-%m-%d %H:%M:%S" } }, "handlers": { "console": { "level": "INFO", "filters": ["require_debug_true"], "class": "logging.StreamHandler", "formatter": "standard" }, "file": { "level": "ERROR", "filters": ["require_debug_false"], "class": "logging.FileHandler", "filename": BASE_DIR / "debug.log", "formatter": "standard", "encoding": "utf-8" # 解决中文日志乱码问题 }, "django.server": { "level": "INFO", "class": "logging.StreamHandler", "formatter": "django.server", }, "mail_admins": { "level": "ERROR", "filters": ["require_debug_false"], "class": "django.utils.log.AdminEmailHandler", }, }, "loggers": { "django": { "handlers": ["file", "console"], "level": "INFO", "propagate": True # 明确开启日志传播 }, # 明确配置请求异常logger "django.request": { "handlers": ["file"], "level": "ERROR", "propagate": True }, # 明确配置安全类日志logger "django.security": { "handlers": ["file"], "level": "ERROR", "propagate": True }, "django.server": { "handlers": ["django.server"], "level": "INFO", "propagate": False, }, # 捕获全局未分类异常 "": { "handlers": ["file"], "level": "ERROR", "propagate": True } }, }
验证方式
- 生产环境DEBUG=False状态下,手动构造一个500错误接口,访问后查看debug.log是否有对应错误堆栈
- 检查日志文件的写入权限,确保运行Django进程的系统用户对debug.log有写入权限
内容的提问来源于stack exchange,提问作者TropicalRaisel
相关产品推荐
相关产品推荐

