Celery从Django模块内部记录到文件

时间:2013-12-20 05:46:20

标签: python django logging celery

我的tasks.py

中有以下内容
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中的日志消息在由工作任务运行时转到芹菜日志。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您应该能够为Django进程和Celery进程单独配置记录器,就像根据定义它们在不同的进程中运行一样。

实际上我很惊讶日志输出没有转到单独的日志文件;因此,您可能有必要了解已经存在的任何类型的日志记录配置。

Python记录输出的位置由logging handlers定义。

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

对于Celery,似乎没有直接的方法来覆盖日志记录设置。他们似乎给出了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