Celery: присоедините пользовательский логгер к стандартному обработчику celery (logfile)

Я хотел бы иметь логгер, который можно использовать как в django, так и в celery.

При использовании django он должен печатать в консоль, а при использовании из задачи celery я бы хотел, чтобы он выводил данные с помощью обработчика celery по умолчанию (в моем случае он сбрасывает данные в файл, указанный аргументом командной строки --logfile).

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

Вот что у меня есть в моем settings.py файле:

LOGLEVEL = os.environ.get("LOGLEVEL", "info").upper()
LOGGING = {
    "version": 1,  # the dictConfig format version
    "disable_existing_loggers": False,  # retain the default loggers
    "handlers": {
        # console logs to stderr
        "console": {
            "class": "logging.StreamHandler",
            "formatter": "verbose",
        },
        "django.server": DEFAULT_LOGGING["handlers"]["django.server"],
    },
    "formatters": {
        "verbose": {
            "format": "[{asctime}]|{levelname}| {message}",
            "style": "{",
        },
        "django.server": {
            # "()": "django.utils.log.ServerFormatter",
            "format": "[{asctime}]|{levelname}| {message}",
            "style": "{",
        },
    },
    "loggers": {
        # default for all undefined Python modules
        "": {
            "level": "WARNING",
            "handlers": ["console"],
        },
        # Our application code
        "app": {
            "level": LOGLEVEL,
            "handlers": ["console"],
            # Avoid double logging because of root logger
            "propagate": False,
        },
        # Default runserver request logging
        "django.server": DEFAULT_LOGGING["loggers"]["django.server"],
        "django.channels.server": DEFAULT_LOGGING["loggers"]["django.server"],
    },
}

В моем логгере "app" пока есть только консольный обработчик.

Если я определяю регистратор следующим образом:

logger = get_task_logger("app").getChild(__name__)

Вывод идет в консоль, но не в лог-файл.

Если вместо этого я определяю регистратор следующим образом:

logger = get_task_logger(__name__)

Вывод идет в логфайл, но не в консоль.

Я хотел бы каким-то образом добавить стандартный обработчик celery, который, как мне кажется, создается/настраивается здесь, в мой логгер "app".

Возможно ли это?

Вернуться на верх