2010-11-11 12 views
5

Voglio convertire il mio sistema di coda attività in una coda di attività basata su Celery, ma una delle funzionalità attualmente disponibili mi causa qualche problema.Come posso acquisire tutti i record del registro python generati durante l'esecuzione di una serie di attività di Celery?

In questo momento, la mia coda di attività funziona in modo molto approssimativo; Eseguo il lavoro (che genera dati e lo carico su un altro server), raccolgo la registrazione utilizzando una variante sulla libreria di acquisizione del registro di Nose e quindi memorizzo la registrazione per l'attività come un record di risultati dettagliato nel database dell'applicazione.

vorrei rompere questo giù come tre compiti:

  1. raccogliere dati
  2. dati di upload
  3. risultati del report (inclusi tutti accedendo dai precedenti due compiti)

I vero kicker qui è la collezione di registrazione. In questo momento, utilizzando l'acquisizione del registro, dispongo di una serie di record di registro per ogni chiamata al registro effettuata durante la generazione dei dati e il processo di caricamento. Questi sono necessari per scopi diagnostici. Dato che le attività non sono nemmeno garantite per l'esecuzione nello stesso processo, non è chiaro come ottenerlo in una coda di attività di Celery.

La mia soluzione ideale a questo problema sarà un metodo banale e idealmente minimamente invasiva di catturare tutta la registrazione durante le attività predecessore (1, 2) e rendendolo disponibile per l'attività Reporter (3)

sono io migliore off restando abbastanza grossolana con la mia definizione di compito, e mettendo tutto questo lavoro in un compito? o c'è un modo per passare il logging catturato esistente al fine di collezionarlo alla fine?

risposta

0

Sembra che una sorta di "osservatore" sia l'ideale. Se puoi guardare e consumare i registri come un flusso, puoi succhiare i risultati non appena arrivano. Poiché l'osservatore sarebbe in esecuzione separatamente e quindi non ha dipendenze rispetto a ciò che sta guardando, credo che questo soddisfi le tue esigenze per un non -vasiva soluzione.

0

Django Sentry è un'utilità di registrazione per Python (e Django) e ha il supporto per Celery.

1

Suppongo che stiate usando il modulo logging. È possibile utilizzare un logger con nome separato per set di attività per eseguire il lavoro. Essi erediteranno tutte le configurazioni dal livello superiore.

in 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 

Qui, tutti i record sono stati inviati allo stesso logger di nome. Ora, è possibile utilizzare 2 metodi per recuperare i record:

  1. Configura file di ascoltatore con nome che dipende dal nome logger. Dopo l'ultimo passaggio, leggi tutte le informazioni da quel file. Assicurati che il buffer di output sia disabilitato per questo listener o rischi di perdere i record.

  2. Creare un listener personalizzato che accumuli i record in memoria, quindi restituirli tutti quando lo si dice. Userò memcached per l'archiviazione qui, è più semplice che creare il proprio storage cross-process.

Problemi correlati