使用 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。这是“便宜”吗?这是只获取我的请求的日志消息的最佳方式吗?我的主要假设是每个请求都有自己的线程,并且该线程名称实际上会选择正确的项目。
我是否从根本上误解了 Python 日志记录?也许我应该只在“模块级”静态添加一次额外的处理程序,并且我的调度应该做一些更轻松的事情。
欢迎任何建议。我不太了解 Python(尤其是 App Engine Python)在日志记录方面的作用。显然,这是非常可能的,因为 App Engine 日志查看器做完全相同的事情:它显示该请求的所有日志消息。事实上,如果我能以某种方式搭载它,那就更好了。不过,它绝对需要 super 便宜 - 也就是说,RPC 调用不会削减它。
如果有帮助,我可以添加一些代码。
请您参考如下方法:
我在这里发现了很多好处:
from google.appengine.api import logservice
entries = logservice.logs_buffer().parse_logs()
