芹菜任务不会向管理员发送有关记录器关键消息的电子邮件



每次我调用 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()调用获得。我假设您编写了自己的记录器,该记录器执行您在原始问题中描述的逻辑。阅读有关芹菜日志记录的更多信息,了解如何禁用此行为并根据需要调整芹菜。

相关内容

  • 没有找到相关文章

最新更新