Python rq.worker не соблюдает конфигурацию Django LOGGING - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь запустить автономный скрипт вне приложения Django, которое взаимодействует с очередью Redis и использует модуль Python rq. Все работает нормально, но где-то либо обновление до Python 3.8 (с 2.7), либо обновление с Django 2.2 (с 1.11), либо с rq до 1.2.2 (с 0.13) rq перестали соблюдать Django LOGGING конфиг. Вот как выглядит мой Django settings.py файл:

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "verbose": {
            "format": "%(asctime)s [%(process)d] [%(levelname)s] pathname=%(pathname)s lineno=%(lineno)s %(message)s",
            "datefmt": "%Y-%m-%d %H:%M:%S"
        },
        "simple": {
            "format": "%(asctime)s [%(name)s] %(levelname)s - %(message)s"
        }
    },
    "handlers": {
        "null": {
            "level": "DEBUG",
            "class": "logging.NullHandler"
        },
        "console": {
            "level": "DEBUG",
            "class": "logging.StreamHandler",
            "formatter": "simple"
        }
    },
    "loggers": {
        "django.request": {
          "handlers": ["console"],
          "level": "ERROR",
          "propagate": True
        },
        "api": {
          "handlers": ["console"],
          "level": "DEBUG",
          "propagate": True
        },
        "worker": {
          "handlers": ["console"],
          "level": "DEBUG",
          "propagate": True
        },
        "rq.worker": {
          "handlers": ["console"],
          "level": "ERROR",
          "propagate": True
         }
    }
}

А вот как выглядит мой worker.py:

import django
django.setup()

import os
import logging
import redis
import multiprocessing
from rq import Queue, Connection
from rq.worker import HerokuWorker

logger = logging.getLogger("worker")

if __name__ == "__main__":
    redis_url = os.getenv("REDISTOGO_URL", None)
    if redis_url:
        conn = redis.from_url(redis_url)
        listen = ["high", "default", "low"]
        thread_count = int(os.getenv("WORKER_THREAD_COUNT", "4"))
        logger.debug("Setting up worker script, threads=%d", thread_count)

        with Connection(conn):
            workers = []
            for i in range(thread_count):
                worker = HerokuWorker(map(Queue, listen))
                p = multiprocessing.Process(target=worker.work)
                workers.append(p)
                p.start()
    else:
        logger.error("Could not find REDISTOGO_URL environment variable")

Вы видите, у меня есть rq.worker установлен на ERROR уровень, но я получаю INFO сообщений на консоли. Раньше это работало просто отлично, но, к сожалению, я не замечал этого до тех пор, пока не закончил обновление. Я попытался удалить раздел rq.worker из settings.py, и сообщения по-прежнему печатались, но не в том формате, который я определил. Итак, я знаю, что мой settings.py файл читается правильно. Кто-нибудь еще сталкивался с этим или есть предложения? Я действительно не хочу раскошелиться rq только для решения этой проблемы.

1 Ответ

0 голосов
/ 17 февраля 2020

Естественно, через 5 минут после публикации я решил посмотреть на источник python-rq и обнаружил, что метод work принимает logging_level. Вот как выглядит новая рабочая строка:

p = multiprocessing.Process(target=worker.work, kwargs={"logging_level": "ERROR"})

Кажется, что теперь все работает так, как ожидалось.

...