Как программно сказать, что сельдерей отправляет все сообщения журнала в stdout или stderr?

Как включить программный сбор сельдерея?

С терминала это прекрасно работает:

celery worker -l DEBUG 

Когда я вызываю get_task_logger(__name__).debug('hello') , я вижу, что сообщение появляется в терминале. (отображаются stdout и stderr). Я могу даже import logging и вызвать logger.info('hi') и увидеть это тоже. (оба работают)

Однако, разрабатывая задачу, я предпочитаю использовать тестовый модуль и вызывать функцию задачи напрямую, а не запускать весь рабочий. Но я не вижу сообщения журнала. Я понимаю, что сельдерей перенаправляет все на свой внутренний аппарат, но я хочу видеть также сообщения журнала на стандартном выводе.

Как я могу сказать, что сельдерей отправил копию сообщений журнала на стандартный вывод?

Я прочитал кучу онлайн-статей о входе в систему, но кажется, что ряд связанных с протоколированием конфигурационных vars из сельдерея устарел, и мне непонятно, из документов, что является поддерживаемым путем сегодня.

Вот пример модуля, который создает объект сельдерея и пытается регистрировать выход. В терминале ничего не отображается.

Например, mymodule.py

 from celery import Celery import logging from celery.utils.log import get_task_logger app = Celery('test') app.config_from_object('myfile', True) get_task_logger(__name__).warn('hello world') logging.getLogger(__name__).warn('hello world 2') 

EDIT Я знаю, что я могу добавить обработчик, чтобы перенаправить часть вывода обратно на терминал, добавив обработчик

 log = get_task_logger(__name__) h = logging.StreamHandler(sys.stdout) log.addHandler(h) 

Но есть ли способ «Сельдерей»? Возможно, тот, который позволяет мне также иметь печатные тексты с сельдерием.

 [2014-03-02 15:51:32,949: WARNING] hello world 

    Я смотрел на ту же проблему …

    Лучше всего работать с обработчиком сигнала, согласно http://docs.celeryproject.org/en/latest/userguide/signals.html#after-setup-logger

    В вашем файле celery.py используйте:

     from celery.signals import after_setup_logger import logging @after_setup_logger.connect() def logger_setup_handler(logger, **kwargs ): my_handler = MyLogHandler() my_handler.setLevel(logging.DEBUG) my_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #custom formatter my_handler.setFormatter(my_formatter) logger.addHandler(my_handler) logging.info("My log handler connected -> Global Logging") if __name__ == '__main__': app.start() 

    то вы можете определить MyLogHandler() усмотрению.

    Чтобы отправить журналы в STDOUT, вы также сможете использовать (я его не тестировал):

     my_handler = logging.StreamHandler(sys.stdout)