将来自Celery任务的日志记录信息存储在Django数据库中

时间:2019-07-04 09:14:59

标签: python django celery django-celery celerybeat

假设我要在Celery中定期执行以下功能:

import logging
import requests

log = logging.getLogger(__name__)


def spam():
    data = fetch_some_data()
    log.info(f'Fetched {len(data)} data')

    stuff = []
    for item in data:
        try:
            response = requests.get(url + item)
            response.raise_for_status()
        except RequestException as exc:
            log.error(f'Error when requesting {item}: {exc}')
            continue

        stuff.append(response.text)

    for item in stuff:
        do_something(item)
    log.info(f'Processed {len(stuff)} items')

执行附带的任务时:

from hello import spam

@app.task
def run():
    spam()

我想查看任务的结果以及记录的消息。例如,Flower可以显示task progress and history,但我想将日志记录信息添加为单独的字段(例如“信息消息”和“错误消息”)。同样,如果使用django-celery-results,则它可以在Django Admin视图中显示相同的信息。

实现此目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

只需利用 after_setup_logger 装饰器。您可以在celery启动时注册记录器,以便可以在celery任务中使用它。

@after_setup_logger.connect
def setup_loggers(logger, *args, **kwargs):
    import logging

    fh = logging.FileHandler('/path/to/file')
    logger = logging.getLogger("test-logger")
    logger.addHandler(fh)

现在,您可以在任务中使用“测试记录器”记录器,并将日志重定向到文件中。