Jelajahi Sumber

给云存接口添加访问日志功能

lhq 4 tahun lalu
induk
melakukan
178ef6d12b
4 mengubah file dengan 125 tambahan dan 4 penghapusan
  1. 16 1
      Model/models.py
  2. 2 0
      Object/ResponseObject.py
  3. 100 0
      Service/CloudLogs.py
  4. 7 3
      Service/middleware.py

+ 16 - 1
Model/models.py

@@ -1589,4 +1589,19 @@ class Pc_Info(models.Model):
         db_table = 'pc_info'
         verbose_name = u'pc信息表'
         verbose_name_plural = verbose_name
-        ordering = ('id',)
+        ordering = ('id',)
+
+
+class CloudLogModel(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    user = models.CharField(max_length=100, default='', db_index=True, blank=True, verbose_name=u'用户')
+    uid = models.CharField(blank=True, max_length=32, verbose_name=u'uid', default='')
+    operation = models.CharField(max_length=100, db_index=True, default='', blank=True, verbose_name=u'操作')
+    ip = models.CharField(max_length=100, default='', db_index=True, blank=True, verbose_name=u'访问ip地址')
+    url = models.CharField(max_length=150, default='', blank=True, verbose_name=u'访问路径')
+    time = models.IntegerField(null=True, blank=True, db_index=True, verbose_name=u'访问时间')
+    content = models.TextField(blank=True, default='', verbose_name=u'参数内容')
+    class Meta:
+        db_table = 'cloud_log'
+        verbose_name = '云存api记录表'
+        verbose_name_plural = verbose_name

+ 2 - 0
Object/ResponseObject.py

@@ -98,6 +98,7 @@ class ResponseObject(object):
             10042: 'The device has registered a certificate',
             10043: 'The device does not registered a certificate',
             10044: 'Request to publish MQTT topic message failed',
+            10045: 'Already the latest version',
         }
         data_cn = {
             0: '成功',
@@ -190,6 +191,7 @@ class ResponseObject(object):
             10042: '此设备已注册证书',
             10043: '此设备没有注册证书',
             10044: '请求发布MQTT主题消息失败',
+            10045: '当前为最新版本',
         }
         if self.lang == 'cn':
             msg = data_cn

+ 100 - 0
Service/CloudLogs.py

@@ -0,0 +1,100 @@
+import json
+import threading
+import datetime
+import time
+
+from bson import utc
+
+from Object.RedisObject import RedisObject
+from Service.CommonService import CommonService
+from Service.MiscellService import MiscellService
+from Service.TemplateService import TemplateService
+from Ansjer.config import SERVER_TYPE
+from Model.models import CloudLogModel
+from Object.UidTokenObject import UidTokenObject
+
+def batch_add_access_log(request, status_code):
+    asy = threading.Thread(target=batch_add_log_ctr, args=(request, status_code))
+    asy.start()
+
+
+def batch_add_log_ctr(request, status_code):
+    request.encoding = 'utf-8'
+    if request.method == 'GET':
+        request_dict = request.GET
+    elif request.method == 'POST':
+        request_dict = request.POST
+    else:
+        return
+    api_list = [
+        'cloudstorage/getsignsts',
+        'cloudstorage/storeplaylist',
+        'cloudstorage/queryvodlist',
+    ]
+    request_path = request.path.strip().strip('/')
+    if request_path in api_list:
+        user = MiscellService.get_access_name(request_dict)
+        uidToken = request_dict.get('uidToken', None)
+        utko = UidTokenObject(uidToken)
+        uid = utko.UID
+        if not uid:
+            uid = request_dict.get('uid', None)
+        clientIP = CommonService.get_ip_address(request)
+        # now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
+        # beijing = datetime.timezone(datetime.timedelta(hours=8))
+        # utc = datetime.timezone.utc  # 获取 UTC 的时区对象
+        # beijing_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(beijing)
+        now_time = time.time()
+        password = request_dict.get('userPwd', None)
+        if password is not None:
+            request_dict = dict(request_dict)
+            request_dict.pop('userPwd')
+        content = json.dumps(request_dict)
+        add_data = {
+            'user': user,
+            'ip': clientIP,
+            'uid': uid,
+            'url': request.META['SERVER_PROTOCOL'] + '-' + request.method + '-' + request.path,
+            'operation': request_path,
+            'time': now_time,
+            'content': content
+        }
+        print('add_data', add_data)
+        redisObj = RedisObject()
+        loggerData = json.dumps(add_data)
+        # print(loggerData)
+        if SERVER_TYPE == 'Ansjer.formal_settings':
+            logKey = 'logger'
+        else:
+            logKey = 'test_logger'
+        redisObj.rpush(name=logKey, val=loggerData)
+        # 判断redis列表长度
+        if redisObj.llen(name=logKey) > 100:
+            data_list = redisObj.lrange(logKey, 0, -1)
+            redisObj.del_data(key=logKey)
+            add_batch_log(data_list)
+
+
+# 访问日志批量添加
+def add_batch_log(data_list):
+    try:
+        if data_list:
+            querysetlist = []
+            for i in data_list:
+                data = json.loads(i.decode('utf-8'))
+                querysetlist.append(CloudLogModel(user=data['user'],
+                                                  ip=data['ip'],
+                                                  uid=data['uid'],
+                                                  url=data['url'],
+                                                  operation=data['operation'],
+                                                  time=data['time'],
+                                                  content=data['content']))
+            CloudLogModel.objects.bulk_create(querysetlist)
+        else:
+            return
+    except Exception as e:
+        print('error:')
+        print(repr(e))
+        return False
+    else:
+        return True

+ 7 - 3
Service/middleware.py

@@ -8,6 +8,7 @@ from Ansjer.config import SERVER_TYPE
 from Object.ResponseObject import ResponseObject
 from Service.MiscellService import MiscellService
 from Service import OperatingLogs
+from Service import CloudLogs
 import django.db
 
 
@@ -56,7 +57,7 @@ class StatisticsUrlMiddleware(MiddlewareMixin):
         (无视其种类)以及相应的view。 Django将立即返回该 HttpResponse。
         '''
         if request.path != '/favicon.ico':
-            print('process_request', request)
+            print('process_request:', request)
         result = self._https_statistics_to_reverse(request)
         if result == -1:
             response = ResponseObject()
@@ -65,7 +66,7 @@ class StatisticsUrlMiddleware(MiddlewareMixin):
 
     def process_view(self, request, callback, callback_args, callback_kwargs):
         if request.path != '/favicon.ico':
-            print('process_view', request)
+            print('process_view:', request)
         return None
 
     def process_response(self, request, response):
@@ -82,12 +83,15 @@ class StatisticsUrlMiddleware(MiddlewareMixin):
         ########记录访问日志
         # MiscellService.DynamoDB_add_access_log(request=request, status_code=response.status_code)
         if request.path !='/favicon.ico':
-            print('process_response', request, response)
+            print('process_response:', request, response)
+            print('SERVER_TYPE:', SERVER_TYPE)
+            CloudLogs.batch_add_access_log(request=request, status_code=response.status_code)
             try:
                 pass
                 # mysql
                 if SERVER_TYPE!="Ansjer.formal_settings":
                     # print('添加日志')
+                    # CloudLogs.batch_add_access_log(request=request, status_code=response.status_code)
                     OperatingLogs.add_access_log(request=request, status_code=response.status_code)
                     MiscellService.add_access_log(request=request, status_code=response.status_code)
                 # else: