我有一个Flask应用,它带有一个基于标准Python记录器编写的记录系统。
我希望每个页面视图都有唯一的ID,因此我可以跟踪整个过程并检查记录的错误和过早的结局。
我首先尝试将唯一的ID创建者放入logger对象的__init__中,其结果是所有请求都具有相同的视图。我将创建唯一ID的位置移到了方法上,这改善了情况-日志中出现了多个ID,并且一切似乎都正常。
但是,似乎有时两个请求使用相同的记录器对象。似乎当一个请求正在运行时,另一个请求启动并运行ID生成方法。然后第一个请求也开始使用新ID ...
22:04:31 - MPvzGNAelE : in content 22:04:31 - MPvzGNAelE : in parse options 22:04:31 - MPvzGNAelE : finished parse options 22:04:31 - MPvzGNAelE : about to query API for user info. user id : 7401173, resource id: 59690 #the following is where the 2nd requests starts 22:04:31 - SbEOjmbFSa : in frame initial 22:04:31 - SbEOjmbFSa : in frame 2 - cleaned IDs are 1114 127059932 22:04:31 - SbEOjmbFSa : in parse options 22:04:31 - SbEOjmbFSa : finished parse options 22:04:31 - SbEOjmbFSa : in frame finishing - for 1114 127059932 #the following is the first request continuing with the new ID 22:04:31 - SbEOjmbFSa : api user info status is success 22:04:31 - SbEOjmbFSa : user_id is 5549565, user name is joe_spryly 22:04:31 - SbEOjmbFSa : config[data_source] is 0 22:04:31 - SbEOjmbFSa : api seems to be working, so going to retrieve items for 59690 7401173 22:04:31 - SbEOjmbFSa : getting items from API for 59690 7401173
这是我的日志对象代码...
class AS_Log(object): def __init__(self): self.log=logging.getLogger('aman_log') logging.basicConfig(filename='amanset_log',level=logging.DEBUG) def generate_id(self): from random import choice import string chars=string.letters+string.digits self.log_id=''.join([choice(chars) for i in range(10)]) def format_date(self,timestamp): return datetime.fromtimestamp(timestamp).strftime('%m-%d-%y %H:%M:%S') def log_msg(self,message): self.log.debug('{0} - {1} : {2}'.format(self.format_date(time()),self.log_id,message))
我在烧瓶应用程序中启动日志
as=AS_Log()
然后根据每个请求调用generate_id
@app.route('// /') def aman_frame(resource_id,user_id): as.generate_id() return amanset_frame(resource_id,user_id)
然后使用amanset_frame函数中的日志。
我有一些想法,认为这与Flask中的相关应用程序上下文有关,但我不知道如何使用它来解决此问题。我是否使用app_context()?如果使用,如何使用?