日志组件

在Django项目中配置全局日志组件

settings文件配置

from datetime import date

# 日志配置
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '[%(levelname)s] [%(asctime)s] %(lineno)d %(message)s'
        },
        'simple': {
            'format': '[%(levelname)s] [%(asctime)s] %(lineno)d %(message)s'
        },
    },
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        # 控制台日志打印级别
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        # 文件日志记录级别
        'file': {
            'level': 'WARNING',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            # 使用当天日期作为文件名
            'filename': os.path.join(BASE_DIR, 'logs', f'{date.today().strftime("%Y-%m-%d")}.log'),
            # 保留30天的日志
            'backupCount': 30,
            # 日志格式:详细格式
            'formatter': 'verbose',
            # 文件内容编码
            'encoding': 'utf-8',
            # 使用本地时间
            'utc': False,
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'level': 'INFO',
            # 是否让日志信息继续冒泡给其他的日志处理系统
            'propagate': True,
        },
    }
}

在utils文件创建logger.py文件

import logging

logger = logging.getLogger('django')

配置完成后,在其他视图函数中导入使用即可

from rest_framework.views import exception_handler as drf_exception_handler
from utils.logger import logger

# 在全局异常处理工具中使用
def exception_handler(exc, context):
    """
    统一的异常信息处理
    """
    res = drf_exception_handler(exc, context)

    request = context.get('request')
    view = context.get('view')
    ip = request.META.get('REMOTE_ADDR')
    path = request.get_full_path()

    try:
        user_id = request.user.username
        if not user_id:
            user_id = '【未登录用户】'
    except:
        user_id = '【未登录用户】'

    # 异常内容记录日志
    logger.error('用户域账号:%s,请求地址为:%s,执行的视图函数为:%s,错误原因:%s' % (
        user_id, path, str(view), str(exc)))
    if res:
      # drf的异常,一种是从res.data这个字典的detail中取,一种是直接取data
      if isinstance(res.data, dict):
          msg = res.data.get('detail', None)
          if not msg:
              msg = res.data
          data = {'code': 406, 'msg': msg}
      else:
          data = {'code': 406, 'msg': res.data}

    else:
        # django的异常
        data = {'code': 408, 'msg': str(exc)}
    return Response(data)
posted @ 2025-04-10 10:16  wellplayed  阅读(56)  评论(0)    收藏  举报