Django + Celery logging

Есть много ресурсов на эту тему, но ни один из них не сработал, к сожалению.

  1. Вот мои настройки 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,
        },
    },
    

    }

  2. Celery инициализируется до импорта base.py/инициализации настроек (что может быть виновником)

  3. Я пробовал настраивать CELERYD_HIJACK_ROOT_LOGGER = False, использовать сигнал after_setup_task_logger (я пробовал печатать, чтобы увидеть, отправляется ли этот сигнал вообще, но он не отправляется) и ни один из них не имел никакого эффекта

    .
  4. Я попробовал использовать 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, я вижу, что обработчик есть, но его нет в обработчике логгера, и он, похоже, не распространяется (т.е. я не вижу сообщения лога). . только если я прикреплю обработчик непосредственно к объекту логгера, я смогу увидеть сообщение, но очевидно, что проблема в том, что я должен прикреплять обработчик каждый раз, когда я объявляю логгер в новом файле, что не имеет смысла.

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