使用Google App Engine,Python 2.7,threadsafe:true
,webapp2。
我想在API响应中包含所有logging.XXX()
消息,因此我需要一种有效的方法来收集请求范围内发生的所有日志消息。我也希望在threadsafe:true
中操作,所以我需要小心,只能得到正确的日志消息。
目前,我的策略是在我的webapp2调度方法的开头添加logging.Handler
,然后在最后删除它。要仅为我的线程收集日志,我使用当前线程的名称实例化logging.Handler
;处理程序将简单地抛出来自不同线程的日志记录。我正在使用线程名称而不是线程ID,因为我在使用ID时在dev_appserver
上收到了一些意外结果。
问题:
以这种方式不断添加/删除logging.Handler
对象是否有效?即,每个请求都会添加Handler
,然后删除{{1}}。这“便宜”吗?
这是仅获取我的请求的日志消息的最佳方式吗?我的主要假设是每个请求都有自己的线程,该线程名称实际上会选择正确的项目。
我是否从根本上误解了Python日志记录?也许我应该只在静态“模块级”添加一个额外的Handler,并且我的调度应该做得更轻。
任何建议表示赞赏。我对Python(特别是App Engine Python)在日志记录方面的作用并不了解。显然,这是非常可能的,因为App Engine日志查看器完全相同:它显示该请求的所有日志消息。事实上,如果我能以某种方式捎带,那就更好了。它绝对需要超级廉价 - 也就是说,RPC调用不会削减它。
如果有帮助,我可以添加一些代码。
答案 0 :(得分:1)
我在这里找到了很多好处:
from google.appengine.api import logservice
entries = logservice.logs_buffer().parse_logs()