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

Django项目中logger.info()信息未显示在日志文件问题

Django自定义logger.info日志不写入文件问题定位

问题复现代码

views.py

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

import logging, traceback
logger = logging.getLogger('django')

def home(request):
  logger.info('Some Message')
  return render(request, 'home.html')

settings.py 日志配置

import os

LOGGING ={
  'version':1,
  'loggers':{
    'django':{
        'handlers':['file'],
        'level':'DEBUG'
    }
 },
 'handlers':{
     'file':{
        'level':'INFO',
        'class':'logging.FileHandler',
        'filename':'./logs/debug3.log',
        'formatter':'simple'
    }
 },
  'formatters':{
    'simple':{
        'format':'{levelname} {asctime} {module} {process:d} {thread:d} {message}',
        'style':'{',
    }
}
}

故障根因

问题由两个配置错误共同导致:

  • 缺失disable_existing_loggers: False配置:Django基于Python logging的dictConfig加载日志规则,该参数默认值为True,会禁用所有配置加载前已初始化的logger,绑定到django logger上的文件handler无法正常接收业务侧写入的日志条目。
  • 错误复用框架内置logger:django前缀的logger为Django框架内部预留,有默认的日志过滤规则,业务代码直接写入的日志会被框架过滤逻辑拦截,不会正常落盘。

修复步骤

  1. 修改settings.py中的LOGGING配置,补充必填参数,新增业务专属logger,同时将日志路径改为基于BASE_DIR的绝对路径,避免工作目录变化导致日志写入位置异常:
import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

LOGGING ={
  'version':1,
  'disable_existing_loggers': False, # 关闭默认的已有logger禁用逻辑
  'loggers':{
    'django':{
        'handlers':['file'],
        'level':'DEBUG',
        'propagate': True
    },
    # 业务自定义logger,名称可根据自身app名调整
    'my_app':{
        'handlers':['file'],
        'level':'INFO',
        'propagate': False
    }
 },
 'handlers':{
     'file':{
        'level':'INFO',
        'class':'logging.FileHandler',
        # 改用绝对路径
        'filename': os.path.join(BASE_DIR, 'logs/debug3.log'),
        'formatter':'simple'
    }
 },
  'formatters':{
    'simple':{
        'format':'{levelname} {asctime} {module} {process:d} {thread:d} {message}',
        'style':'{',
    }
}
}
  1. 修改views.py中logger的初始化逻辑,使用自定义命名的业务logger替代框架内置的django logger:
from django.shortcuts import render
from django.http import HttpResponse
import logging

# logger名称和配置中自定义的logger名保持一致
logger = logging.getLogger('my_app')

def home(request):
  logger.info('Some Message')
  return render(request, 'home.html')

前置校验:确认项目根目录下logs文件夹存在,且Django运行进程对该文件夹有读写权限,否则会触发文件写入权限错误。


内容的提问来源于stack exchange,提问作者Muhammad Usama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:45:38