Это просто отлично. Но зачем вам разные классы регистраторов?
В python разные регистраторы могут быть экземплярами одного и того же класса с разными именами регистраторов.
См. https://docs.python.org/3/howto/logging-cookbook.html
Вы можете установить разные обработчики для разных экземпляров журнала.
Обычно мы создаем и используем регистраторы следующим образом:
module_a.py
import logging
logger = logging.getLogger('module_a')
fh = logging.FileHandler('spama.log')
logger.addHandler(fh)
Class foo:
pass
module_b.py
import logging
logger = logging.getLogger('module_b')
fh = logging.FileHandler('spamb.log')
logger.addHandler(fh)
Class bar:
pass
Если вы хотите настроить множество регистраторов в одном файле:
log_config.py
# You could create your loggers anywhere, but configure them in one file
import logging.config
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'filters': {
'special': {
'()': 'project.logging.SpecialFilter',
'foo': 'bar',
}
},
'handlers': {
'null': {
'level':'DEBUG',
'class':'django.utils.log.NullHandler',
},
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
'formatter': 'simple'
},
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'filters': ['special']
}
},
'loggers': {
'module_a': {
'handlers':['null'],
'propagate': True,
'level':'INFO',
},
'module_b': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
'myproject.custom': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO',
'filters': ['special']
}
}
}
logging.config.dictConfig(LOGGING)
main.py
import module_a
import module_b
import log_config
module_a.logger.debug("something")
Кстати, если вы получаете регистратор с одинаковым именем в разных файлах python, они абсолютно одинаковы пример. Фактически getLogger
означает функцию get or create a logger with the given name
.