Конфигурация ведения журналов в Django звездообразная нотация

Допустим, у меня есть следующая конфигурация журнала Django:

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
        },
    },
    "root": {
        "handlers": ["console"],
        "level": "WARNING",
    },
    "loggers": {
        "django": {
            "handlers": ["console"],
            "level": "INFO",
            "propagate": False,
        },
        "app1.management.commands": {
            "handlers": ["console"],
            "level": "DEBUG",
            "propagate": False,
        },
        "app2.management.commands": {
            "handlers": ["console"],
            "level": "DEBUG",
            "propagate": False,
        },
        "app3.management.commands": {
            "handlers": ["console"],
            "level": "DEBUG",
            "propagate": False,
        },
    },
}

Обратите внимание, как я повторяю одну и ту же конфигурацию для всех команд управления приложениями. Я бы хотел иметь возможность объединить их в одну запись, например, так:

"*.management.commands": {
    "handlers": ["console"],
    "level": "DEBUG",
    "propagate": False,
}

Но, похоже, это не работает. Возможно ли это или мне нужно повторить конфигурацию для всех приложений?

Конечно, вы можете построить соответствующий dict динамически, используя подход, подобный следующему:

from pprint import pprint

class DynamicLoggerDict(dict):
    def __init__(self, data, common, apps):
        super().__init__(data)
        for app in apps:
            key = f'{app}.management.commands'
            self[key] = common
            
LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
        },
    },
    "root": {
        "handlers": ["console"],
        "level": "WARNING",
    },
    "loggers": DynamicLoggerDict({
            "django": {
            "handlers": ["console"],
            "level": "INFO",
            "propagate": False
        }},  {
            "handlers": ["console"],
            "level": "DEBUG",
            "propagate": False,
        }, ['app1', 'app2', 'app3']),
}

pprint(LOGGING)

При запуске вышеприведенная команда печатает

{'disable_existing_loggers': False,
 'handlers': {'console': {'class': 'logging.StreamHandler'}},
 'loggers': {'app1.management.commands': {'handlers': ['console'],
                                          'level': 'DEBUG',
                                          'propagate': False},
             'app2.management.commands': {'handlers': ['console'],
                                          'level': 'DEBUG',
                                          'propagate': False},
             'app3.management.commands': {'handlers': ['console'],
                                          'level': 'DEBUG',
                                          'propagate': False},
             'django': {'handlers': ['console'],
                        'level': 'INFO',
                        'propagate': False}},
 'root': {'handlers': ['console'], 'level': 'WARNING'},
 'version': 1}
Вернуться на верх