Регистратор Django ведет запись только на консоль из рабочего процесса celery

У меня есть следующая конфигурация ведения журнала:

"root": {
    "level": "ERROR",
    "handlers": ["console", "server_file"],
},
"handlers": {
    "celery_file": {
        "class": "logging.handlers.RotatingFileHandler",
        "level": "DEBUG",
        "filename": os.path.join(ROOT_LOGS_DIR, "celery", "celery.log"),
        "formatter": "standard",
        "maxBytes": 1024 * 1024 * 50,  # 50 MB
        "backupCount": 30,
    },
    "server_file": {
        "class": "logging.handlers.RotatingFileHandler",
        "level": "DEBUG",
        "filename": os.path.join(ROOT_LOGS_DIR, "server.log"),
        "formatter": "standard",
        "maxBytes": 1024 * 1024 * 50,  # 50 MB
        "backupCount": 30,
    },
"loggers": {
    # '': {'handlers': ["root"], "level": "DEBUG", "propagate": True, },
    'django': {'handlers': ['django'], 'level': 'DEBUG', 'propagate': False, },        
    "celery": {
        "handlers": ["celery_file"],
        "level": "INFO",
        "propagate": True,
    },

Из задачи celery,

log = logging.getLogger("celery.inbound_outbound_jobs")
log.error("Hello, World!") # this won't be written to files. Only Console.

Я запускаю эту задачу с помощью celery-beat и worker.

celery -A log_project beat --loglevel=info
celery -A log_project worker --loglevel=info

Но это не запись логов в server.log и celery.log.

Выполняется только ведение журнала с консоли.

При запуске этой задачи непосредственно с сервера django, а не как рабочего процесса celery, это работает во всех celery.log, server.log и console.

enter image description here

Кто-нибудь может помочь разобраться в этом?

проблема в том, что ваш celery.inbound_outbound_jobs регистратор не настроен в вашей конфигурации ведения журнала, и поскольку для вашего celery регистратора установлено значение propagate: True, он должен передавать журналы в корневой регистратор, но, тем не менее, ваш root у логгера есть только обработчики "console" и "server_file", но нет "celery_file".

явно укажите celery.inbound_outbound_jobs в конфигурации ведения журнала, явно добавьте регистратор в раздел loggers

"loggers": {
    "django": {"handlers": ["django"], "level": "DEBUG", "propagate": False},
    "celery": {"handlers": ["celery_file"], "level": "INFO", "propagate": True},
    "celery.inbound_outbound_jobs": {
        "handlers": ["celery_file"],
        "level": "INFO",
        "propagate": True,
    },
}

Также убедитесь, что celery использует настройки ведения журнала django в вашем файле celery.py внутри вашего проекта django, измените его следующим образом

import logging
from celery import Celery
app = Celery("log_project")

app.config_from_object("django.conf:settings", namespace="CELERY")

from django.conf import settings
import logging.config
logging.config.dictConfig(settings.LOGGING)
app.autodiscover_tasks()

когда вы входите в систему с помощью logging.getLogger("celery.inbound_outbound_jobs"), она должна корректно записываться в celery.log

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