2013-12-20 2 views
3

У меня есть следующий в моем tasks.pyкаротажа сельдерея в файл внутри Django модули

from celery.utils.log import get_task_logger 
logger = get_task_logger("celery.task") 

У меня есть протоколирование установки для celery.task в моих settings.py и всех бревнах из моего tasks.py файла правильно записывается в файл.

У меня есть модули Django. Эти модули можно вызывать непосредственно из Django или по заданию Celery. Я хочу, если модуль вызывается Django, тогда журналы должны перейти в файл журнала Django. Если модуль вызывается задачей, журнал должен перейти к журналу задач сельдерея.

Пример:

# tasks.py 

from app.foo import MyFoo 

@task(name="bar") 
def boo(): 
    MyFoo.someFoo() 

# app.foo.py 

log = logging.getLogger(__name__) 

Я хочу, чтобы сообщения журнала внутри MYFOO идти в журнал сельдерея при ведении задачи работника.

Любые идеи?

ответ

0

Вы должны иметь возможность настраивать регистраторы отдельно для процесса Django и процесса Celery, как если бы они по определению выполнялись в отдельных процессах.

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

Где выходные данные каротажа Python определяются logging handlers.

Настройка регистратора для Джанго: https://docs.djangoproject.com/en/dev/topics/logging/

Для сельдерея, не похоже, чтобы быть простой способ, чтобы переопределить параметры ведения журнала. Кажется, что они дают celery.signals.setup_logging, где вы можете установить точку останова, использовать API logging, чтобы перенастроить обработчики ведения журнала, чтобы перейти в отдельный файл журнала.

http://docs.celeryproject.org/en/latest/configuration.html#logging

В качестве альтернативы, вы можете просто вытащить другие logger объекта на уровне задач. Когда вы выполняете задачу, вы знаете, выполняется ли она из Django (eager) или Celery.

Я никогда не делал этого сам, но, судя по всему, задачи Celery показывают контекст задания задачи как параметр self.request (ничего общего с классами Python).

http://docs.celeryproject.org/en/latest/userguide/tasks.html#context

Так в начале вашей функции задачи вы можете переключаться между лесорубами:

# Define web_worker_logger 
# Define task_logger 

@task(name='example') 
def moobar(): 
    logger = web_worker_logger if self.request.is_eager else task_logger 
+0

Спасибо, это позволит мне знать, является ли задача запустить работником или нет. Это не то, что мне нужно. Я обновил вопрос. – ATOzTOA

+0

Это может быть то, что вам нужно. Потому что вы не можете знать, работаете ли вы внутри Clery или внутри Django, прежде чем находитесь внутри функции. Таким образом, это единственный момент, когда вы можете выбрать, какой регистратор использовать локально. –

+0

Однако я предлагаю вам изучить, как настроить регистраторы сельдерея. Поскольку рабочий Celery работает по отдельному процессу, он имеет свои собственные файлы конфигурации, где вы можете настроить обработчики протоколов Python. http://docs.python.org/2/library/logging.html#handler-objects –

Смежные вопросы