CloudLogs.py 3.7 KB

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