2025-07-08 17:24:07 by wst
python调试django1.8
python2.7
记录日志不生效
1. 配置settings.py, 添加如下内容:
# 确保日志目录存在
LOG_DIR = os.path.join(BASE_DIR, 'logs')
if not os.path.exists(LOG_DIR):
os.makedirs(LOG_DIR)
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(message)s',
'style': '%',
},
'simple': {
'format': '%(levelname)s %(message)s',
'style': '%',
},
},
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
},
'file': { # 添加文件处理器
'level': 'DEBUG', # 设置文件处理器的日志级别
'class': 'logging.FileHandler', # 使用文件处理器
'filename': os.path.join(LOG_DIR, 'django.log'), # 指定日志文件路径
'formatter': 'verbose', # 使用 verbose 格式
},
},
'loggers': {
'django': {
'handlers': ['console', 'file'], # 添加文件处理器到 django 日志记录器
'level': 'INFO',
},
}
}
2. view调用,views.py内容如下:
from django.http import HttpResponse, JsonResponse
import os
import logging
logger = logging.getLogger('django')
def index(request):
"""Render the index page."""
logger.info("main page.")
return HttpResponse("<p>Hello, world. You're at the index page.</p><p><a href='/download/'>Download</a></p>,<a href='/test/'>good</a>")
def download_file(request):
"""Download a file from the server."""
file_web_path = u'/home/master/uff09_1744609555.pdf'
file_name = os.path.basename(file_web_path)
fn = file_web_path
print ("fn:", fn,fn.encode("gbk"))
if not os.path.exists(fn):
return HttpResponse("File not found.", status=404)
with open(fn, 'rb') as file:
response = HttpResponse(file.read(), content_type='application/octet-stream')
response['Content-Disposition'] = "attachment; filename={}".format(file_name.encode("utf-8"))
return response
def test_json(request):
"test json header"
logger.info("logger:{}".format({"a":1}))
res = JsonResponse({"a": 1, "b": 2})
return res
LOG_DIR = os.path.join(BASE_DIR, 'logs')
if not os.path.exists(LOG_DIR):
os.makedirs(LOG_DIR)
作用:这段代码确保日志文件的存储目录存在。
BASE_DIR
是 Django 项目的根目录路径。
LOG_DIR
是日志文件存储的目录路径,这里设置为项目根目录下的 logs
文件夹。
如果 logs
文件夹不存在,os.makedirs(LOG_DIR)
会创建它。
目的:避免在写入日志文件时因目录不存在而导致错误。
LOGGING
配置LOGGING
是一个字典,用于定义 Django 项目的日志配置。它遵循 Python 的 logging
模块的配置规范。
version
'version': 1,
作用:指定日志配置的版本。目前,logging
模块只支持版本 1
。
目的:确保配置格式的兼容性。
disable_existing_loggers
'disable_existing_loggers': False,
作用:控制是否禁用已存在的日志记录器。
如果设置为 True
,Django 会禁用所有已存在的日志记录器(除了 django
和 root
)。
如果设置为 False
,Django 会保留已存在的日志记录器。
目的:避免日志配置冲突。通常建议设置为 False
,以便保留其他库的日志记录器。
filters
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
作用:定义日志过滤器。
require_debug_false
:只有当 DEBUG = False
时,日志消息才会通过。
require_debug_true
:只有当 DEBUG = True
时,日志消息才会通过。
目的:根据项目的 DEBUG
设置,控制日志消息的输出。
formatters
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(message)s',
'style': '%',
},
'simple': {
'format': '%(levelname)s %(message)s',
'style': '%',
},
},
作用:定义日志的格式化方式。
verbose
:详细格式,包含日志级别、时间戳、模块名和消息。
simple
:简单格式,仅包含日志级别和消息。
目的:根据需要选择不同的日志格式。style: '%'
表示使用 %
格式化风格。
handlers
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
},
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': os.path.join(LOG_DIR, 'django.log'),
'formatter': 'verbose',
},
},
作用:定义日志处理器,决定日志消息如何输出。
console
:
level
:日志级别为 INFO
,表示只记录 INFO
及以上级别的日志。
filters
:应用 require_debug_true
过滤器,只有在 DEBUG = True
时才会输出到控制台。
class
:使用 logging.StreamHandler
,将日志输出到控制台。
file
:
level
:日志级别为 DEBUG
,表示记录所有级别的日志。
class
:使用 logging.FileHandler
,将日志写入文件。
filename
:指定日志文件路径为 logs/django.log
。
formatter
:使用 verbose
格式化方式。
loggers
'loggers': {
'django': {
'handlers': ['console', 'file'],
'level': 'INFO',
},
},
作用:定义日志记录器,决定哪些日志消息会被记录。
django
:
handlers
:将 console
和 file
处理器绑定到 django
日志记录器,表示日志消息会同时输出到控制台和文件。
level
:日志级别为 INFO
,表示记录 INFO
及以上级别的日志。
这个日志配置的作用是:
控制台日志:
当 DEBUG = True
时,INFO
及以上级别的日志会输出到控制台。
文件日志:
所有级别的日志(DEBUG
及以上)都会写入 logs/django.log
文件,格式为详细模式(verbose
)。
日志格式:
控制台日志使用简单格式(simple
),文件日志使用详细格式(verbose
)。
日志级别:
django
日志记录器的级别为 INFO
,表示只记录 INFO
及以上级别的日志。
通过这种方式,你可以灵活地控制日志的输出方式和格式,同时确保日志信息既可以在开发环境中实时查看,也可以在生产环境中持久化存储。
INFO 2025-07-08 16:58:04,292 views logger:{'a': 1}