An access information saved to a log

Logging Configuration

Dev.py modify the log configuration

# 官网:https://docs.djangoproject.com
# 中文loggin配置:https://docs.djangoproject.com/zh-hans/2.2/topics/logging/
# 在项目的 dev.py 中配置 Django 项目的log日志,那Django自己出现的打印记录不仅可以输出到控制台,还可以记录到日志文件,当项目上线记录日志时及其重要的
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },
    },
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            # 实际开发建议使用WARNING
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/mylog.log"),
            # 日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose',
            'encoding': 'utf-8'
        },
        'my_access_file': {
            # 实际开发建议使用WARNING
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/access.log"),
            # 日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose',
            'encoding': 'utf-8'
        },
    },
    # 日志对象
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True,  # 是否让日志信息继续冒泡给其他的日志处理系统
        },'my_django': {
            'handlers': ['file','my_access_file'],
            'propagate': True,  # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}

Add the middleware dev.py

MIDDLEWARE = [
  'home.my_process_request.MD1',  # 自定义中间件MD1
]

New /home/my_process_request.py

import datetime
import logging

from django.utils.deprecation import MiddlewareMixin
from rest_framework_jwt.authentication import jwt_decode_handler

logger = logging.getLogger('my_django')
class MD1(MiddlewareMixin):

    def process_request(self, request):
        # 通过下面的方式进行简单配置输出方式与日志级别
        request_time = datetime.datetime.now()
        # 获取ip地址
        if request.META.get('HTTP_X_FORWARDED_FOR'):
            ip = request.META['HTTP_X_FORWARDED_FOR']
        else:
            ip = request.META['REMOTE_ADDR']
        # 获取请求方式
        request_type = request.META['REQUEST_METHOD']
        # 获取接口路径
        request_path = request.path
        # 获取请求参数
        request_get = request.body if request.META['REQUEST_METHOD'] == 'POST' else request.GET
        # 获取请求user
        request_token = request.META.get('HTTP_AUTHORIZATION')
        user_name = ''
        if request_token:
            toke_user = jwt_decode_handler(request_token)
            user_name = toke_user.get('username')
        dic = {
            '请求时间': request_time,
            '请求方式': request_type,
            '接口路径': request_path,
            '请求user': user_name,
            '请求ip': ip,
            '请求参数':request_get
        }
        logger.error(dic)

Guess you like

Origin www.cnblogs.com/liqianglog/p/11611213.html
Recommended