Django 默认后台有一个 LogEntry 来记录后台操作记录,但是系统添加了前端之后使用了 Django Rest Framework 提供api,就没有办法记录前端操作了,现在我想把操作记录都存储在数据库里面便于以后审计和聚合。 首先 mongodb 配置settings.py
:
pip install django-mongolog
import pymongo
INSTALLED_APPS = [
...
'mongolog',
]
MIDDLEWARE = [
...
"api.utils.RequestLog",
]
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '[%(asctime)s] [%(filename)s:%(lineno)d] [%(levelname)s]- %(message)s'
},
},
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'verbose'
},
'file': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': './monitor.log',
'formatter': 'verbose'
},
'mongolog': {
'level': 'CRITICAL',
'class': 'mongolog.SimpleMongoLogHandler',
'connection': 'mongodb://xxx:27017',
'collection': 'mongolog'
},
},
'loggers': {
'django': { # default日志,存放于log中
'handlers': ['console', 'file', 'mongolog'],
'level': 'DEBUG',
'propagate': True,
},
'django.db.backends': { # 打印SQL语句到console,方便开发
'handlers': ['console', 'file'],
'level': 'DEBUG',
'propagate': True,
},
'django.request': { # 打印错误信息到console,方便开发
'handlers': ['console', 'file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
然后编写中间件
import logging
from django.utils.deprecation import MiddlewareMixin
logger = logging.getLogger('django')
class RequestLog(MiddlewareMixin):
def process_request(self, request):
logger.critical('{} {} {} {} by {} with {}'.format(request.method, request.path, request.content_type, request.body.decode(), request.user, request.FILES))
# def process_response(self, request, response):
# pass
# def process_view(self, request, view_func, view_args, view_kwargs):
# pass
这样就可以记录每一次访问的具体信息,包括请求体内容,可能有坑的地方就是密码也记录下来了。。。。太不安全,不过这里是我们公司内网使用,问题不大
参考文献:
https://www.cnblogs.com/chenxuming/articles/9529128.html
网友评论