import json import threading import datetime import time from bson import utc import jwt 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, OAUTH_ACCESS_TOKEN_SECRET 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 request_path = request.path.strip().strip('/') if 'storeplaylist' in request_path or 'signplaym3u8' in request_path: # 只记录上传和播放视频的操作 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) if len(uid) > 50: uid = jwt.decode(uid, OAUTH_ACCESS_TOKEN_SECRET, algorithms='HS256').get('uid', '') 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