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)