美文网首页
2019-11-15 Django 中间件产生日志并存储到 Mo

2019-11-15 Django 中间件产生日志并存储到 Mo

作者: 多吃水果少吃肉 | 来源:发表于2019-11-15 15:06 被阅读0次

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

相关文章

网友评论

      本文标题:2019-11-15 Django 中间件产生日志并存储到 Mo

      本文链接:https://www.haomeiwen.com/subject/yvhsictx.html