Wysyłanie wiadomości logów ze wszystkich zadań selery do jednego pliku

Zastanawiam się, jak skonfigurować bardziej szczegółowy system logowania. Wszystkie moje zadania używają

logger = logging.getLogger(__name__)

Jako rejestrator całego modułu.

Chcę, aby selery logował się do " celeryd.Zaloguj "i Moje zadania do" zadań.log", ale nie mam pojęcia jak to uruchomić. Używając {[1] } z django-selery mogę przekierować wszystkie wiadomości dziennika związane z celeryd do celeryd.log ale nie ma śladu komunikatów dziennika utworzonych w moich zadaniach.

Author: Martijn Pieters, 2011-05-31

2 answers

Uwaga: Ta odpowiedź jest nieaktualna od wersji 3.0, w której teraz używasz get_task_logger() Aby skonfigurować rejestrator zadań. Zobacz sekcję logowania w dokumencie co nowego w selery 3.0 , Aby uzyskać szczegółowe informacje.


Seler posiada dedykowane wsparcie dla logowania, dla każdego zadania. Zobacz dokumentacja zadania na temat :

Możesz użyć rejestratora workers, aby dodać wyjście diagnostyczne do dziennika Workers:]}
@celery.task()
def add(x, y):
    logger = add.get_logger()
    logger.info("Adding %s + %s" % (x, y))
    return x + y

Są dostępnych jest kilka poziomów logowania, a o ustawieniu poziomu logowania pracowników decyduje czy zostaną zapisane do pliku dziennika.

Oczywiście, możesz również po prostu użyć print, ponieważ wszystko, co jest napisane do standardowego out / - err, będzie zapisany również do pliku dziennika.

Pod maską to wszystko jest nadal standardowym modułem logowania Pythona. Możesz ustawić CELERYD_HIJACK_ROOT_LOGGER option to False, aby umożliwić działanie własnej konfiguracji logowania, w przeciwnym razie selery skonfiguruje obsługę dla Ciebie.

Jednak w przypadku zadań, wywołanie .get_logger() pozwala na utworzenie osobnego pliku dziennika dla poszczególnych zadań. Po prostu podaj argument logfile i przekieruje komunikaty dziennika do oddzielnego pliku:

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

Last but not least, you can just configure your top-level package in the Python logging module and give it a file handler of it ' s own. Skonfigurowałbym to używając sygnału celery.signals.after_setup_task_logger; tutaj zakładam, że wszystkie Twoje Moduły żyją w pakiecie o nazwie foo.tasks (jak w foo.tasks.email i 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)

Teraz każdy logger, którego nazwa zaczyna się od foo.tasks będzie miał wszystkie wiadomości wysyłane do tasks.log zamiast do głównego loggera(który nie widzi żadnej z tych wiadomości, ponieważ {[13] } jest False).

 96
Author: Martijn Pieters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-01 12:31:36

Tylko podpowiedź: seler ma swój własny handler logowania:

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

Ponadto seler rejestruje wszystkie dane wyjściowe z zadania. Więcej szczegółów w selery docs for Task Logging

 5
Author: kolypto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-21 13:19:36