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