Ведение журнала 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")
Мой вопрос таков:
- когда celery logger propagate =True, будет ли этот журнал обрабатываться celery logger? Распространяется ли он также на root logger?
- если propagate=False, будет ли журнал по-прежнему обрабатываться celery logger?
Ответ 1.
начиная с propagate = True
, любое лог-сообщение из celery.inbound_outbound_jobs
будет передаваться в родительский файл (celery
), а затем, при необходимости, в корневой регистратор. Если бы у корневого регистратора также были соответствующие обработчики (например,, "server_file"
), журналы также распространялись бы на корень
Ответ 2.
Регистратор celery.inbound_outbound_jobs
по-прежнему будет наследоваться от celery
, поскольку он явно не определен. Однако, начиная с propagate = False
, журналы не будут перенаправляться в корневой регистратор.
Сообщение будет зарегистрировано только в
celery.log
(черезcelery_file
).Он не попадет в корневой регистратор и, следовательно, не будет записан в
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
},
}