我的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中的日志消息在由工作任务运行时转到芹菜日志。
有什么想法吗?
答案 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