django项目中日志配置和使用

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

配置解释:

1. 确保日志目录存在

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) 会创建它。

  • 目的:避免在写入日志文件时因目录不存在而导致错误。

2. LOGGING 配置

LOGGING 是一个字典,用于定义 Django 项目的日志配置。它遵循 Python 的 logging 模块的配置规范。

2.1 version

'version': 1,
  • 作用:指定日志配置的版本。目前,logging 模块只支持版本 1

  • 目的:确保配置格式的兼容性。

2.2 disable_existing_loggers

'disable_existing_loggers': False,
  • 作用:控制是否禁用已存在的日志记录器。

    • 如果设置为 True,Django 会禁用所有已存在的日志记录器(除了 djangoroot)。

    • 如果设置为 False,Django 会保留已存在的日志记录器。

  • 目的:避免日志配置冲突。通常建议设置为 False,以便保留其他库的日志记录器。

2.3 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 设置,控制日志消息的输出。

2.4 formatters

'formatters': {
    'verbose': {
        'format': '%(levelname)s %(asctime)s %(module)s %(message)s',
        'style': '%',
    },
    'simple': {
        'format': '%(levelname)s %(message)s',
        'style': '%',
    },
},
  • 作用:定义日志的格式化方式。

    • verbose:详细格式,包含日志级别、时间戳、模块名和消息。

    • simple:简单格式,仅包含日志级别和消息。

  • 目的:根据需要选择不同的日志格式。style: '%' 表示使用 % 格式化风格。

2.5 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 格式化方式。

2.6 loggers

'loggers': {
    'django': {
        'handlers': ['console', 'file'],
        'level': 'INFO',
    },
},
  • 作用:定义日志记录器,决定哪些日志消息会被记录。

    • django

      • handlers:将 consolefile 处理器绑定到 django 日志记录器,表示日志消息会同时输出到控制台和文件。

      • level:日志级别为 INFO,表示记录 INFO 及以上级别的日志。

总结

这个日志配置的作用是:

  1. 控制台日志

    • DEBUG = True 时,INFO 及以上级别的日志会输出到控制台。

  2. 文件日志

    • 所有级别的日志(DEBUG 及以上)都会写入 logs/django.log 文件,格式为详细模式(verbose)。

  3. 日志格式

    • 控制台日志使用简单格式(simple),文件日志使用详细格式(verbose)。

  4. 日志级别

    • django 日志记录器的级别为 INFO,表示只记录 INFO 及以上级别的日志。

通过这种方式,你可以灵活地控制日志的输出方式和格式,同时确保日志信息既可以在开发环境中实时查看,也可以在生产环境中持久化存储。

日志结果:

INFO 2025-07-08 16:58:04,292 views logger:{'a': 1}

 


Comments(0) Add Your Comment

Not Comment!