Как войти в журнал сельдерея вне задач сельдерея (внутри представления django)?

Предположим, конечная точка в проекте django

def my_view(request, my_id):
    if is_request_valid(request):
        logger = logging.getLogger('celery.task')
        logger.info('Starting a task for a thing with ID %i', my_id)
        my_cool_task.apply_async()

Теперь, согласно документации по сельдерею это может войти в систему, так как

Доступен специальный регистратор с именем «celery.task», который вы можете наследовать от этого регистратора, чтобы автоматически получать имя задачи и уникальный идентификатор как часть журналов.

Но регистратор «celery.task» работает только внутри задачи. Таким образом, в представлении этот журнал пойдет в никуда.

Кроме того, я поигрался с настройкой некоторой переменной журнала внутри settings.py, а затем переназначил журналирование сельдерея. Поигрался с CELERY_WORKER_HIJACK_ROOT_LOGGER, но даже когда я использую корневой регистратор, логи не появляются в консоли. Ни использование getLogger("сельдерей") не помогает.

Кажется, это простая вещь, но я целый день пытаюсь это сделать, пожалуйста, помогите.

UPD: Видела пост на реддите с той же проблемой, но ответов нет

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
220
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, по существу вопроса, взломать регистратор сельдерея невозможно.

Однако есть несколько обходных путей:

  1. Создайте задачу для логирования, например.
from celery.utils.log import get_task_logger

@shared_task
def log_stuff(level, message, *args, **kwargs):
    get_task_logger().log(level, message, *args, **kwargs)

Однако это грязно по многим причинам: главным образом потому, что ваш журнал будет выполнен, когда к нему доберется рабочий, и это просто превратится в беспорядок.

  1. Войдите в тот же файл. Перейдите в your_projects_name/settings.py, определите переменную LOGGING, например:
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False, 
    'formatters': {
        'simple': {
            'format': '[%(levelname)s] %(message)s',
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            'level': 'INFO',
            # with rotating handlers you can configure max size and other stuff
            'class': 'logging.FileHandler',
            'formatter': 'simple',
            'filename': 'my_log.log',
        },
    # that's the most interesting part
    'loggers':
        'django': {
            'handlers': ['file', 'console'],
            'level': 'INFO',
        },
        'celery': {
            'handlers': ['file', 'console'],
            'level': 'INFO',
        },
}

Примечание. Конфигурация ведения журнала должна быть более сложной.

Теперь никаких дальнейших действий не требуется, учитывая настройку django celery по умолчанию из документации, и что ваша версия django — 4.2.11, а celery — 5.3.6 — в более старых версиях вы можете поиграть с сельдереем. сигналы.setup_logging.

Второе примечание: потоки настроены для отдельных процессов django и celery: вы не увидите их все в одном месте.

  1. Рассмотрите возможность использования таких инструментов, как logstash, Sentry, Graypy, New Relic — они соберут все журналы в одном месте. Я не пробовал ни один из них, но это тоже используется.

Наконец, конечно, это может работать с чем угодно, не обязательно только с Джанго.

Другие вопросы по теме