在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)