簡體   English   中英

將每個請求上下文添加到使用Python登錄

[英]Adding Per request Context to Logging in Python

背景

對於REST api服務,我想以一種我不必重寫整個應用程序的日志語句的方式提供更多的日志記錄上下文。 我正在使用燒瓶內的python日志庫和帶有gunicorn的eventlet運行器類型。

用例

想象一下,通過這個系統的所有請求都有一個唯一的(足夠的)事務ID作為來自某個上游源(可能是反向代理)的頭傳遞的未來。 我想用每個日志語句記錄此事務id,以便即使在峰值負載期間也可以通過我的系統輕松跟蹤給定的請求。

途徑

編寫一個自定義日志記錄上下文過濾器類,從燒瓶中提取所需信息。 我的理解是,我應該能夠從線程本地上下文變量中提取此信息(即請求對象)。 在初始化全局根記錄器之后,我只需設置這個自定義上下文過濾器,所有這些都應該在調試方面做得很好!

我從以下食譜文檔中發現了這種方法... https://docs.python.org/2/howto/logging-cookbook.html#using-filters-to-impart-contextual-information

問題

  • 您是否預見到這種方法存在任何擴展問題?
  • 有關將此事務ID下游傳播到我網絡中的其他請求的想法?
  • 使用eventlet worker類型是否會妨礙這種行為(即並發問題導致的混合上下文)?
  • 只因為你可以,並不意味着你應該。 我不應該這樣做的任何其他原因?

聽起來您可能正在考慮實施類似X-Trace的系統。 免責聲明:我使用像這樣運作的商業產品。

關於傳播,隨着應用程序復雜性的增加,它可能成為一個問題。 由於您需要更多現成的解決方案或后端的多語言組件,因此需要支持上下文日志記錄或因缺乏​​可見性而負擔沉重。 對於備用消息傳遞機制也是如此,如果你需要傳遞除了像JBoss或Thrift之類的HTTP-RPC之外的某些內容,或者某種類型的消息隊列實現復雜性。

對於異步請求,您肯定需要確保將唯一ID從阻塞代碼路徑正確傳遞到事件代碼路徑,否則冒着混合/重用id的風險。 在分析呼叫傳播時,這可能是微妙的紅色鯡魚的來源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM