首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式将Celery日志生成/写入文件

以编程方式将Celery日志生成/写入文件
EN

Stack Overflow用户
提问于 2019-09-20 14:42:52
回答 2查看 1.5K关注 0票数 0

我正在尝试运行一个简单的异步任务,使用celery和rabbitmq作为它的消息代理。我想以编程方式生成终端中显示的celery日志并将其写入文件中。

我有一个任务文件,我在其中定义了我的任务,一个应用程序文件,我在其中调用要执行的任务,另外,我还为所有文件配置并导入了我的日志。我正在尝试将我在日志配置中创建的日志对象导入到我的celery Task中,但由于某些原因,它不会生成日志。我还从控制台尝试了-f日志文件,-- LOGFILE =LOGFILE命令,它在推送时生成日志文件,但我想以编程的方式生成它,就像常规日志记录发生的方式一样。我使用这个命令来运行我的celery,它在我运行它的控制台中生成日志-- celery -A taskhandler.celery_app worker -l info -E --concurrency=1。Celery不能读取和处理我的项目日志对象,也不能生成我给出的路径的日志。我也尝试过这些:https://www.distributedpython.com/2018/08/28/celery-logging/ http://docs.celeryproject.org/en/latest/userguide/tasks.html#logging

但我还没有达成任何解决方案。

代码语言:javascript
复制
import time
from celery.utils.log import get_task_logger
from log import Logger
from taskhandler.celery_app import celery
#logger = get_task_logger(__name__)
logger = Logger.get_logger()


@celery.task(task_ignore_result=False, track_started=True)
def train_global_trepan_task(count):
    factor = 1

    for i in range(1, count + 1):
        factor = factor * i
        time.sleep(5)
        logger.info("Task id {} factorial of {} is {}".format(train_global_trepan_task.request.id, i, factor))
    return factor

下面是日志记录设置

代码语言:javascript
复制
import logging
from datetime import date
from configuration import get_config
import sys
sys.path.append("..")
class Logger:
    _logger = None

    @classmethod
    def get_logger(cls):
        name = 'logs//' + date.today().strftime("%b-%d-%Y") + '.log'
        if not cls._logger or name != cls._logger.__dict__['name']:
            logging.basicConfig(filename=name,
                                filemode='a',
                                format='%(asctime)s [%(filename)s - %(lineno)s] -%(funcName)s - %(levelname)s - %('
                                       'message)s')
            cls._logger = logging.getLogger(name)
            log_level = {
                'debug': logging.DEBUG,
                'info': logging.INFO,
                'error': logging.ERROR,
                'warning': logging.WARNING,
                'critical': logging.CRITICAL,
            }[get_config('logger', 'level').lower()]
            cls._logger.setLevel(log_level)
        return cls._logger

预期结果:芹菜日志应该已经在我的日志文件夹中生成了,路径是给它的。实际结果: Celery日志不会以编程方式在我的日志文件中生成,只有当我们在控制台中给出celery log命令时,它才会在文件中生成,而且它们也是不一致的。

EN

回答 2

Stack Overflow用户

发布于 2019-09-20 16:02:17

我建议使用after_setup_logger芹菜装饰器,你可以在芹菜启动时注册你的记录器。然后,您的记录器将在您的芹菜任务中可用。

代码语言:javascript
复制
from celery.signals import after_setup_logger

@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)
票数 1
EN

Stack Overflow用户

发布于 2019-12-17 14:21:58

celery信号@after_setup_logger.connect将celery日志记录重定向到celery启动时生成的文件,因此,如果您需要信息,则必须查看旧目录或文件并提取任务详细信息。如果不重新启动celery,就不可能在新文件中获得新的任务详细信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58023057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档