Генерация / запись логов сельдерея в файл программно - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь запустить простую асинхронную задачу, используя celery и rabbitmq в качестве посредника сообщений.Я хочу сгенерировать и записать журналы сельдерея, которые появляются в терминале, в файл программным способом.

У меня есть файл задачи, в котором я определил свою задачу, файл приложения, из которого я вызываю эту задачу для выполнения, а также я настроил и импортировал логирование для всех файлов.Я пытаюсь импортировать объект ведения журнала, который я создал в своей конфигурации ведения журнала, в мою задачу Celery, но по какой-то причине он не генерирует журналы.Я также попробовал с консоли команду -f LOGFILE, --logfile = LOGFILE, которая генерирует файл журнала при нажатии, но я хочу сгенерировать его программно так, как это происходит при обычной регистрации.Я использовал эту команду для запуска своего сельдерея, который генерирует журналы в консоли, откуда я ее запускаю - сельдерей -A taskhandler.celery_app работник -l информация -E --concurrency = 1.Celery не может прочитать и обработать мой объект журнала для проекта и сгенерировать журналы по указанному мною пути.Я также попробовал это: 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 log в нашей консоли, и это тоже не соответствует действительности.

1 Ответ

0 голосов
/ 20 сентября 2019

Я бы предложил использовать after_setup_logger декоратор сельдерея, где вы можете зарегистрировать свои логгеры во время запуска сельдерея.Тогда ваш логгер будет доступен в ваших задачах с сельдереем.

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)
...