Django Celery记录最佳做法

我正在尝试让Celery日志记录与一起使用Django。我已经登录设置settings.py进入控制台(在上托管时效果很好Heroku)。在每个模块的顶部,我有:

import logging

logger = logging.getLogger(__name__)

在我的task.py中,我有:

from celery.utils.log import get_task_logger

logger = get_task_logger(__name__)

这对于记录来自任务的调用非常有效,并且我得到如下输出:

2019-11-13T18:05:38+00:00 app[worker.1]: [2019-11-13 18:05:38,527: INFO/PoolWorker-2] Syc feed is starting

但是,如果那个任务然后在另一个模块中调用一个方法,例如一个queryset方法,我将得到重复的日志条目,例如

2019-11-13T18:00:51+00:00 app[worker.1]: [INFO] utils.generic_importers.ftp_processor process(): File xxx.csv already imported. Not downloaded

2019-11-13T18:00:51+00:00 app[worker.1]: [2019-11-13 18:00:51,736: INFO/PoolWorker-6] File xxx.csv already imported. Not downloaded

我想我可以用

CELERY_HIJACK_ROOT_LOGGER = False

只是使用Django日志记录,但是当我尝试使用它时却无法正常工作,即使我确实可以使用它,我也会失去"PoolWorker-6"我想要的东西。(顺便说一句,我无法弄清楚如何从Celery中获取要显示在日志条目中的任务名称,因为文档似乎表明应该如此)。

我怀疑这里缺少一些简单的东西。

回答:

当您的记录器在“另一个模块”的开头初始化时,它会链接到另一个记录器。哪个处理您的消息。它可以是root logger,或者通常我在Django项目中看到-名称为logger ''

最好的方法是覆盖您的日志记录配置:

LOGGING = {

'version': 1,

'disable_existing_loggers': True,

'formatters': {

'simple': {

'format': '%(levelname)s %(message)s',

'datefmt': '%y %b %d, %H:%M:%S',

},

},

'handlers': {

'console': {

'level': 'DEBUG',

'class': 'logging.StreamHandler',

'formatter': 'simple'

},

'celery': {

'level': 'DEBUG',

'class': 'logging.handlers.RotatingFileHandler',

'filename': 'celery.log',

'formatter': 'simple',

'maxBytes': 1024 * 1024 * 100, # 100 mb

},

},

'loggers': {

'celery': {

'handlers': ['celery', 'console'],

'level': 'DEBUG',

},

}

}

from logging.config import dictConfig

dictConfig(LOGGING)

在这种情况下,我想它应该按照您的假设工作。

PS dictConfig已在Python2.7 +中添加。

以上是 Django Celery记录最佳做法 的全部内容, 来源链接: utcz.com/qa/434249.html

回到顶部