我的 tasks.py
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 日志文件。如果模块被任务调用,日志应该转到 celery task logger。
例子:
# tasks.py
from app.foo import MyFoo
@task(name="bar")
def boo():
MyFoo.someFoo()
# app.foo.py
log = logging.getLogger(__name__)
我希望 MyFoo 中的日志消息在工作任务运行时转到 celery 日志。
有什么想法吗?
最佳答案
您应该能够为 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
关于python - Celery 从 Django 模块内部记录到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20697104/