簡體   English   中英

如何捕獲在執行一系列Celery任務期間生成的所有python日志記錄?

[英]How can I capture all of the python log records generated during the execution of a series of Celery tasks?

我想將我自己開發的任務隊列系統轉換為基於Celery的任務隊列,但我目前擁有的一個功能讓我感到有些困擾。

現在,我的任務隊列操作非常粗糙; 我運行該作業(生成數據並將其上傳到另一台服務器),使用Nose日志捕獲庫中的變量收集日志記錄,然后將該任務的日志記錄存儲為應用程序數據庫中的詳細結果記錄。

我想把它分解為三個任務:

  1. 收集數據
  2. 上傳數據
  3. 報告結果(包括前兩個任務的所有日志記錄)

這里真正的踢球者是日志記錄集合。 現在,使用日志捕獲,我在數據生成和上載過程中為每個日志調用提供了一系列日志記錄。 這些是診斷目的所必需的。 鑒於任務甚至不能保證在同一個進程中運行,我不清楚如何在Celery任務隊列中完成此任務。

我對這個問題的理想解決方案將是一個簡單且理想的微創方法,在前任任務(1,2)中捕獲所有日志記錄並使其可用於報告任務(3)

我最好還是保持相當粗糙的任務定義,並將所有這些工作放在一個任務中? 或者有沒有辦法傳遞現有的捕獲日志記錄,以便在最后收集它?

我假設您正在使用logging模塊。 您可以為每個任務集使用單獨的命名記錄器來完成工作。 他們將繼承上層的所有配置。

task.py

import logging

@task
step1(*args, **kwargs):
    # `key` is some unique identifier common for a piece of data in all steps of processing
    logger = logging.getLogger("myapp.tasks.processing.%s"%key)
    # ...
    logger.info(...) # log something

@task
step2(*args, **kwargs):
    logger = logging.getLogger("myapp.tasks.processing.%s"%key)
    # ...
    logger.info(...) # log something

在這里,所有記錄都被發送到同一個命名記錄器。 現在,您可以使用2種方法來獲取這些記錄:

  1. 配置文件偵聽器,其名稱取決於記錄器名稱。 在最后一步之后,只需讀取該文件中的所有信息。 確保為此偵聽器禁用輸出緩沖,否則您可能會丟失記錄。

  2. 創建自定義偵聽器,它將在內存中累積記錄,然后在被告知時將它們全部返回。 我在這里使用memcached進行存儲,它比創建自己的跨進程存儲更簡單。

聽起來某種“觀察者”會是理想的。 如果你可以像流一樣觀察和使用日志,你可以在結果進入時啜飲結果。由於觀察者將單獨運行,因此對於它正在觀看的內容沒有任何依賴性我相信這將滿足你對非 - 入侵解決方案。

Django Sentry是Python(和Django)的日志實用程序,並且支持Celery。

暫無
暫無

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

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