将每个请求上下文添加到使用Python登录

时间:2014-08-06 06:48:55

标签: python logging flask

背景

对于REST api服务,我想以一种我不必重写整个应用程序的日志语句的方式提供更多的日志记录上下文。我正在使用烧瓶中的python日志库和带有gunicorn的eventlet运行器类型。

使用案例

想象一个未来,通过这个系统的所有请求都有一个唯一的(足够的)事务ID作为来自某个上游源(可能是反向代理)的头传递。我想用每个日志语句记录这个事务id,以便在高峰负载期间通过我的系统轻松跟踪给定的请求。

方法

编写一个自定义日志记录上下文过滤器类,用于从flask中提取所需信息。我的理解是,我应该能够从线程本地上下文变量中提取此信息(即请求对象)。在初始化全局根记录器之后,我只需设置这个自定义上下文过滤器,所有都应该在调试方面做得好!

我从以下食谱文档中发现了这种方法...... https://docs.python.org/2/howto/logging-cookbook.html#using-filters-to-impart-contextual-information

问题

  • 您是否预见到这种方法存在任何扩展问题?
  • 关于将此事务ID下游传播到我网络中的其他请求的想法?
  • 使用eventlet worker类型是否会妨碍这种行为(即并发问题导致的混合上下文)?
  • 仅仅因为你可以,并不意味着你应该。我不应该这样做的任何其他原因?

1 个答案:

答案 0 :(得分:2)

听起来您可能正在考虑实施类似X-Trace的系统。免责声明:我使用的商业产品就像这样运作。

关于传播,随着应用程序复杂性的增加,它可能成为一个问题。由于您需要更多现成的解决方案或后端的多语言组件,因此需要支持上下文日志记录或因缺乏​​可见性而负担沉重。对于备用消息传递机制也是如此,如果你需要传递除了像JBoss或Thrift之类的HTTP-RPC之外的内容,或某种类型的消息队列实现复杂性。

对于异步请求,您肯定需要确保将唯一ID从阻塞代码路径正确传递到事件代码路径,否则冒着混合/重用id的风险。在分析呼叫传播时,这可能是微妙的红色鲱鱼的来源。