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

标签 python django logging celery

我的 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/

相关文章:

python - Django静态结构

django - 在 DefaultRouter 的根 api View 上订购项目

python - 访问 `.save()`后不能调用 `serializer.data`

logging - 如何登录 Haskell?

python - 我们如何配置 scrapyd 为项目使用 virtualenv?

python - RegExp 匹配重复的字符

python - TensorFlow 2.0 : do you need a @tf. 每个函数之上的函数装饰器?

logging - web2py 应用程序日志记录

java - 如何将主机名附加到 log4j.xml 中的日志文件

python:为什么这不在新行上写入文件?