You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django日志问题:INFO级别日志无法写入文件

Django日志配置问题:INFO/DEBUG日志无输出的解决办法

问题根源

你当前的LOGGING配置里,loggers字段下重复定义了三次"main"键——Python字典不允许重复键,后面的定义会直接覆盖前面的。最后实际生效的只有最后那个绑定efile和console、级别为ERROR的main配置,所以只有ERROR级别的日志能输出到error.log,INFO和DEBUG日志根本没被对应的handler处理,自然info.log和debug.log是空的。

解决方案

正确的做法是用单个logger绑定多个handler,再给每个handler设置对应的日志级别过滤,让不同级别的日志流向不同文件。修改后的完整配置如下:

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "main_formatter": {
            "format": "{asctime}-{levelname}-{module}-{funcName}-{message}",
            "style": "{",
        },
    },
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "formatter": "main_formatter",
            "level": "DEBUG",  # 控制台输出所有级别日志
        },
        "dfile": {
            "class": "logging.FileHandler",
            "filename": "logs/debug.log",
            "formatter": "main_formatter",
            "level": "DEBUG",  # 只处理DEBUG及以上级别
        },
        "file": {
            "class": "logging.FileHandler",
            "filename": "logs/info.log",
            "formatter": "main_formatter",
            "level": "INFO",  # 只处理INFO及以上级别
        },
        "efile": {
            "class": "logging.FileHandler",
            "filename": "logs/error.log",
            "formatter": "main_formatter",
            "level": "ERROR",  # 只处理ERROR及以上级别
        },
        "gfile": {
            "class": "logging.FileHandler",
            "filename": "logs/gunicorn.log",
            "formatter": "main_formatter",
            "level": "DEBUG",
        },
    },
    "loggers": {
        "main": {
            "handlers": ["console", "dfile", "file", "efile"],
            "propagate": True,
            "level": "DEBUG",  # logger级别设为最低,确保所有级别日志都能被捕获
        },
        "gunicorn.access": {
            "handlers": ["gfile", "console"],
            "propagate": False,
            "level": "DEBUG",
        },
    },
}

关键修改说明

  1. 给handler添加级别过滤:每个handler通过level参数指定要处理的最低日志级别,比如dfile接收DEBUG及以上所有日志,file只接收INFO及以上日志,实现不同级别日志分文件存储。
  2. 合并重复的main logger:只保留一个"main" logger,绑定所有需要的handler,并且将其级别设为DEBUG(最低级别),确保所有级别的日志都能被捕获,再分发给各个handler过滤处理。
  3. 保持gunicorn配置不变:原gunicorn日志配置逻辑正常,无需修改。

验证方法

修改配置后重启Django服务,执行以下日志代码:

import logging
logger = logging.getLogger(__name__)

logger.debug("这是一条DEBUG测试日志")
logger.info(f"Password Generated and Sent to {email}")
logger.error(f"{request.user}: Erreur interne. Code [LI.001]")

此时logs目录下的debug.log、info.log、error.log应该都会有对应的日志输出。

内容的提问来源于stack exchange,提问作者Kaiss B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:20:28