CloudLogs.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import json
  2. import threading
  3. import time
  4. import jwt
  5. from Ansjer.config import SERVER_TYPE, OAUTH_ACCESS_TOKEN_SECRET
  6. from Model.models import CloudLogModel
  7. from Object.RedisObject import RedisObject
  8. from Object.UidTokenObject import UidTokenObject
  9. from Service.CommonService import CommonService
  10. from Service.MiscellService import MiscellService
  11. def batch_add_access_log(request, status_code):
  12. asy = threading.Thread(target=batch_add_log_ctr, args=(request, status_code))
  13. asy.start()
  14. def batch_add_log_ctr(request, status_code):
  15. request.encoding = 'utf-8'
  16. if request.method == 'GET':
  17. request_dict = request.GET
  18. elif request.method == 'POST':
  19. request_dict = request.POST
  20. else:
  21. return
  22. request_path = request.path.strip().strip('/')
  23. if 'storeplaylist' in request_path or 'signplaym3u8' in request_path: # 只记录上传和播放视频的操作
  24. user = MiscellService.get_access_name(request_dict)
  25. uidToken = request_dict.get('uidToken', None)
  26. utko = UidTokenObject(uidToken)
  27. uid = utko.UID
  28. if not uid:
  29. uid = request_dict.get('uid', None)
  30. if len(uid) > 50:
  31. uid = jwt.decode(uid, OAUTH_ACCESS_TOKEN_SECRET, algorithms='HS256').get('uid', '')
  32. clientIP = CommonService.get_ip_address(request)
  33. now_time = time.time()
  34. password = request_dict.get('userPwd', None)
  35. if password is not None:
  36. request_dict = dict(request_dict)
  37. request_dict.pop('userPwd')
  38. content = json.dumps(request_dict)
  39. add_data = {
  40. 'user': user,
  41. 'ip': clientIP,
  42. 'uid': uid,
  43. 'url': request.META['SERVER_PROTOCOL'] + '-' + request.method + '-' + request.path,
  44. 'operation': request_path,
  45. 'time': now_time,
  46. 'content': content
  47. }
  48. print('add_data', add_data)
  49. redisObj = RedisObject()
  50. loggerData = json.dumps(add_data)
  51. if SERVER_TYPE == 'Ansjer.formal_settings':
  52. logKey = 'logger'
  53. else:
  54. logKey = 'test_logger'
  55. redisObj.rpush(name=logKey, val=loggerData)
  56. # 判断redis列表长度
  57. if redisObj.llen(name=logKey) > 100:
  58. data_list = redisObj.lrange(logKey, 0, -1)
  59. redisObj.del_data(key=logKey)
  60. add_batch_log(data_list)
  61. # 访问日志批量添加
  62. def add_batch_log(data_list):
  63. try:
  64. if data_list:
  65. querysetlist = []
  66. for i in data_list:
  67. data = json.loads(i.decode('utf-8'))
  68. querysetlist.append(CloudLogModel(user=data['user'],
  69. ip=data['ip'],
  70. uid=data['uid'],
  71. url=data['url'],
  72. operation=data['operation'],
  73. time=data['time'],
  74. content=data['content']))
  75. CloudLogModel.objects.bulk_create(querysetlist)
  76. else:
  77. return
  78. except Exception as e:
  79. print(repr(e))
  80. return False
  81. else:
  82. return True