Регистратор 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
.
Кто-нибудь может помочь разобраться в этом?
проблема в том, что ваш 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