每次我调用 logger.critical 时,我的芹菜任务都不会向应用程序管理员发送电子邮件。
我正在构建一个 Django 应用程序。我的项目的当前配置允许应用程序的管理员在每次创建 logger.critical 消息时收到一封电子邮件。这很容易设置,我只是遵循了两个项目(芹菜和 Django(的文档。出于某种原因,我没有弄清楚,在芹菜任务中运行的代码没有相同的行为,每次创建 logger.critical 消息时,它都不会向应用程序管理员发送电子邮件。
芹菜真的允许这样做吗? 我是否缺少某些配置? 有没有人遇到这个问题并能够解决它?
用:
- 姜戈 1.11
- 芹菜 4.3
感谢您的任何帮助。
如文档中所述,Celery 覆盖当前的日志记录配置以应用自己的日志记录配置,它还说您可以在 Django 设置中将CELERYD_HIJACK_ROOT_LOGGER
设置为False
以防止这种行为,没有充分记录的是,这目前并没有真正起作用。
在我看来,您有两种选择:
1. 防止芹菜使用setup_logging
信号(实际上(覆盖您的配置
打开celery.py
文件并添加以下内容:
from celery.signals import setup_logging
@setup_logging.connect
def config_loggers(*args, **kwags):
pass
之后,您的文件应或多或少如下所示:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from celery.signals import setup_logging
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@setup_logging.connect
def config_loggers(*args, **kwags):
pass
但是,除非您有充分的理由,否则我会避免使用此选项,因为这样您将丢失由 Celery 处理的默认任务日志记录,这很好。
2. 使用特定的记录器
你可以在 DjangoLOGGING
配置中定义一个自定义记录器,并在你的任务中使用它,例如:
姜戈设置:
LOGGING = {
# ... other configs ...
'handlers': {
'my_email_handler': {
# ... handler configuration ...
},
},
'loggers': {
# ... other loggers ...
'my_custom_logger': {
'handlers': ['my_email_handler'],
'level': 'CRITICAL',
'propagate': True,
},
},
}
任务:
import logging
logger = logging.getLogger('my_custom_logger')
@shared_task
def log():
logger.critical('Something bad happened!')
我相信这对您来说是最好的方法,因为据我了解,您需要手动记录消息,这使您可以继续使用 Celery 日志记录系统。
来自 Celery 文档:
默认情况下,将删除根记录器上以前配置的任何处理程序。如果要自定义自己的日志记录处理程序,可以通过设置 worker_hijack_root_logger = False 来禁用此行为。
Celery 安装了自己的记录器,您可以使用get_task_logger()
调用获得。我假设您编写了自己的记录器,该记录器执行您在原始问题中描述的逻辑。阅读有关芹菜日志记录的更多信息,了解如何禁用此行为并根据需要调整芹菜。