68 votes

Envoyer des messages de journal de toutes les tâches de céleri à un seul fichier

Je me demande comment configurer un système de journalisation plus spécifique. Toutes mes tâches utilisent

 logger = logging.getLogger(__name__)
 

comme un enregistreur à l'échelle du module.

Je veux que le céleri se connecte à "celeryd.log" et mes tâches à "tasks.log" mais je ne sais pas du tout comment le faire fonctionner. Utilisation de CELERYD_LOG_FILE de django-celery Je peux router tous les messages de journal liés à celeryd à celeryd.log, mais il n’ya aucune trace des messages de journal créés dans mes tâches.

103voto

Martijn Pieters Points 271458

Note: Cette réponse est obsolète comme de Céleri 3.0, lorsque vous utilisez maintenant get_task_logger() pour obtenir votre par tâche enregistreur de configurer. Veuillez voir la section enregistrement des nouveautés dans le Céleri 3.0 document pour plus de détails.


Le céleri a support dédié pour l'enregistrement, par la tâche. Voir la documentation des Tâches sur le sujet:

Vous pouvez utiliser les travailleurs enregistreur pour ajouter de sortie de diagnostic pour le travailleur journal:

@celery.task()
def add(x, y):
    logger = add.get_logger()
    logger.info("Adding %s + %s" % (x, y))
    return x + y

Il y a plusieurs niveaux de journalisation disponibles, et les travailleurs loglevel réglage décide si oui ou non ils seront écrites dans le fichier journal.

Bien sûr, vous pouvez aussi simplement utiliser l'impression que ce qui est écrit dans la norme/-err sera écrites dans le fichier journal.

Sous le capot, ce n'est pas le standard de python module de journalisation. Vous pouvez définir l' CELERY_HIJACK_ROOT_LOGGER option à False pour permettre à votre propre configuration de la journalisation de travail, sinon, le Céleri permettra de configurer le traitement pour vous.

Toutefois, pour les tâches, l' .get_logger() appel ne permet de mettre en place un fichier journal distinct par la tâche. Il suffit de passer un logfile argument et il va s'en route les messages de log que fichier séparé:

@celery.task()
def add(x, y):
    logger = add.get_logger(logfile='tasks.log')
    logger.info("Adding %s + %s" % (x, y))
    return x + y 

Dernier mais non le moindre, vous pouvez configurer votre package de niveau supérieur dans le python module de journalisation et de lui donner un gestionnaire de fichier propre. J'avais mis cela à l'aide de l' celery.signals.after_setup_task_logger du signal; ici, je suppose que tous vos modules de vivre dans un package nommé foo.tasks (comme en foo.tasks.email et foo.tasks.scaling):

from celery.signals import after_setup_task_logger
import logging

def foo_tasks_setup_logging(**kw):
    logger = logging.getLogger('foo.tasks')
    if not logger.handlers:
        handler = logging.FileHandler('tasks.log')
        formatter = logging.Formatter(logging.BASIC_FORMAT) # you may want to customize this.
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        logger.propagate = False

after_setup_task_logger.connect(foo_tasks_setup_logging)

Maintenant, n'importe quel enregistreur dont le nom commence par foo.tasks aura tous les messages envoyés à l' tasks.log , au lieu de la racine de l'exploitant (ce qui ne veut pas voir l'un de ces messages, car .propagate est Faux).

8voto

kolypto Points 3161

Juste un indice: le céleri a son propre gestionnaire de journalisation:

 from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
 

En outre, le céleri enregistre toutes les sorties de la tâche. Plus de détails sur Celery docs pour l'enregistrement des tâches

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X