Ведение журнала Django - как работает propagate?

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

"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,
    },
"loggers": {
    # '': {'handlers': ["root"], "level": "DEBUG", "propagate": True, },
    'django': {'handlers': ['django'], 'level': 'DEBUG', 'propagate': False, },        
    "celery": {
        "handlers": ["celery_file"],
        "level": "INFO",
        "propagate": True|False,
    },

В приложении,

log = logging.getLogger("celery.inbound_outbound_jobs")
print(log.handlers) # output: [] No handlers
log.error("test")

Мой вопрос таков:

  1. когда celery logger propagate =True, будет ли этот журнал обрабатываться celery logger? Распространяется ли он также на root logger?
  2. если propagate=False, будет ли журнал по-прежнему обрабатываться celery logger?

Ответ 1.

начиная с propagate = True, любое лог-сообщение из celery.inbound_outbound_jobs будет передаваться в родительский файл (celery), а затем, при необходимости, в корневой регистратор. Если бы у корневого регистратора также были соответствующие обработчики (например,, "server_file"), журналы также распространялись бы на корень

Ответ 2.

Регистратор celery.inbound_outbound_jobs по-прежнему будет наследоваться от celery, поскольку он явно не определен. Однако, начиная с propagate = False, журналы не будут перенаправляться в корневой регистратор.

  1. Сообщение будет зарегистрировано только в celery.log (через celery_file).

  2. Он не попадет в корневой регистратор и, следовательно, не будет записан в server.log.

Если вы хотите напрямую присоединить обработчики к "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"],# here you can attach handlers explicitly
        "level": "INFO",
        "propagate": False,                      # here prevent the unnecessary duplication
    },
}
Вернуться на верх