Django + Celery logging
Есть много ресурсов на эту тему, но ни один из них не сработал, к сожалению.
Вот мои настройки django для ведения логов:
LOGGING = { "version": 1, "disable_existing_loggers": False, "formatters": { "default": { "format": "[%(asctime)s: %(levelname)s/%(processName)s] [%(name)s] %(message)s" } }, "filters": {"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"}}, "handlers": { "console": { "level": "INFO", "class": "logging.StreamHandler", "formatter": "default", }, "mail_admins": { "level": "ERROR", "filters": ["require_debug_false"], "class": "django.utils.log.AdminEmailHandler", }, "my_custom_handler": { "level": "INFO", "class": "my_custom_handler_class", }, }, "loggers": { "django.request": { "handlers": ["mail_admins"], "level": "ERROR", "propagate": True, }, "": { "handlers": ["console", "my_custom_handler"], "level": "INFO", "propagate": True, "formatter": "default", }, "celery": { "handlers": ["console", "my_custom_handler"], "level": "INFO", "propagate": True, }, },
}
Celery инициализируется до импорта base.py/инициализации настроек (что может быть виновником)
Я пробовал настраивать
.CELERYD_HIJACK_ROOT_LOGGER = False
, использовать сигнал after_setup_task_logger (я пробовал печатать, чтобы увидеть, отправляется ли этот сигнал вообще, но он не отправляется) и ни один из них не имел никакого эффектаЯ попробовал использовать
setup_logging
, который вроде как сработал:@setup_logging.connect def config_loggers(*args, **kwags): my_handler = MyCustomHandler() root_logger = logging.getLogger() root_logger.addHandler(my_handler) root_logger.level = logging.INFO @worker_process_init.connect def init_worker(**kwargs): logger = get_task_logger(__name__) # or Logger.get_logger(__name__), no difference logger.info("My log message")
И я говорю, что это вроде как сработало только потому, что когда я осматриваю корень объекта логгера в init_worker
, я вижу, что обработчик есть, но его нет в обработчике логгера, и он, похоже, не распространяется (т.е. я не вижу сообщения лога). . только если я прикреплю обработчик непосредственно к объекту логгера, я смогу увидеть сообщение, но очевидно, что проблема в том, что я должен прикреплять обработчик каждый раз, когда я объявляю логгер в новом файле, что не имеет смысла.