2013-12-20 37 views
3

我已经在我的tasks.py芹菜记录从Django的内部文件中的模块

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

我有安装记录在我的settings.py和所有日志以下为celery.task从我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定义。

Django的配置记录仪:https://docs.djangoproject.com/en/dev/topics/logging/

芹菜,似乎没有被覆盖日志记录设置直接的方式。他们似乎给出了celery.signals.setup_logging,您可以在其中设置断点,使用logging API重新配置日志处理程序以转到单独的日志文件。

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记录器。由于Celery工作人员在单独的进程上运行,因此它有自己的配置文件,您可以在其中配置Python日志记录处理程序。 http://docs.python.org/2/library/logging.html#handler-objects –