Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让Python Flask应用程序中的记录器使用每页视图的唯一ID进行日志记录?_Python_Logging_Flask_Applicationcontext - Fatal编程技术网

如何让Python Flask应用程序中的记录器使用每页视图的唯一ID进行日志记录?

如何让Python Flask应用程序中的记录器使用每页视图的唯一ID进行日志记录?,python,logging,flask,applicationcontext,Python,Logging,Flask,Applicationcontext,我有一个Flask应用程序,它带有一个基于标准Python记录器编写的日志系统 我希望每个页面视图都有一个唯一的ID,这样我就可以跟踪整个过程并检查记录的错误和过早结束 我尝试的第一件事是将唯一ID creator放入logger对象的_init_uu中,结果是所有请求都具有相同的视图。我将创建唯一ID的位置移动到了一个方法中,这改善了这种情况——日志中出现了多个ID,而且一切都正常工作 但是,有时两个请求似乎使用同一个记录器对象。似乎当一个请求正在运行时,另一个请求启动并运行ID生成方法。然后

我有一个Flask应用程序,它带有一个基于标准Python记录器编写的日志系统

我希望每个页面视图都有一个唯一的ID,这样我就可以跟踪整个过程并检查记录的错误和过早结束

我尝试的第一件事是将唯一ID creator放入logger对象的_init_uu中,结果是所有请求都具有相同的视图。我将创建唯一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))     
我在flask应用程序中启动日志,如下所示

as=AS_Log()
然后根据请求调用generate_id,如

@app.route('/<resource_id>/<user_id>/')
def aman_frame(resource_id,user_id):
    as.generate_id()
    return amanset_frame(resource_id,user_id)
@app.route('//'))
def aman_帧(资源id、用户id):
as.generate_id()
返回amanset\u帧(资源\u id、用户\u id)
然后在amanset_框架函数中使用日志


我有一些想法,这是与Flask中的应用程序上下文相关的,但我不知道如何使用它来修复这个问题。我是否使用app_context(),如果是,如何使用?

最终,这是由于在多个执行上下文中对共享的
as.log_id
字段进行变异造成的(很可能是线程,但如果
as
与某些uwssgi/mod_wsgi设置一样在共享父解释器中,则可能是greenlet甚至子进程)


修复方法是为记录器使用适当的日志,因此每个执行线程都会创建一个新的记录器。Werkzeug也提供了一个更易于管理的解决方案。

为什么不使用请求的id?谢谢@pvg,这可以解决当前的问题!不过,我想确切地了解发生了什么,因为我打赌我将来会遇到问题(或者已经遇到了,DB连接出现了问题,只是还没有看到问题)。@pvg如何访问Flask中的请求id?似乎类似的问题:您可以只使用对象id.id(请求)。结合时间,它应该为每个请求提供唯一的跟踪。
request-1 --> mutates log_id --> does ... work ... --> response
              request-2 --> mutates log_id  --> does ... work ... --> response