簡體   English   中英

生成/寫入 Celery 以編程方式登錄到文件

[英]Generating/Writing Celery Logs into a file programmatically

我正在嘗試使用 celery 和 rabbitmq 作為消息代理運行一個簡單的異步任務。 我想以編程方式生成並寫入終端中顯示的 celery 日志到文件中。

我有一個任務文件,我在其中定義了我的任務,一個應用程序文件,我從中調用要執行的任務,並且我為所有文件配置和導入了我的日志記錄。 我正在嘗試將我在日志記錄配置中創建的日志記錄 object 導入到我的 celery 任務中,但由於某種原因,它不會生成日志。 我還嘗試了來自控制台的 -f LOGFILE, --logfile=LOGFILE 命令,該命令在推送時生成一個日志文件,但我想以編程方式生成它,就像常規日志記錄發生的方式一樣。 我已經使用這個命令來運行我的 celery,它會在我運行它的控制台中生成日志——celery -A taskhandler.celery_app worker -l info -E --concurrency=1。 Celery 無法讀取和處理我的項目日志 object 並生成日志到我提供的路徑。 我也試過這些: https://www.distributedpython.com/2018/08/28/celery-logging/http ://docs.celeryproject.org/en/latest/userguide/tasks.html#logging

但我還沒有找到任何解決方案。

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

以下是日志記錄設置

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 日志不會以編程方式在我的日志文件中生成,只有當我們在控制台中給出 celery 日志命令時才會在文件中生成它,而且它們也不一致。

我建議使用after_setup_logger celery 裝飾器,您可以在 celery 啟動期間注冊您的記錄器。 然后,您的記錄器將在您的 celery 任務中可用。

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)

celery 信號 @after_setup_logger.connect 將 celery 日志重定向到 celery 啟動時生成的文件,因此,如果您想查看目錄並提取任務詳細信息,請查看舊目錄或文件。 如果不重新啟動 celery,則無法在新文件中獲取新的任務詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM