Python: мне нужен синглтон? - PullRequest
       32

Python: мне нужен синглтон?

0 голосов
/ 30 апреля 2020

В logger.py есть несколько экземпляров классов логгеров, которые я импортирую в несколько других модулей.

logger.py

class Logger:
    def __init__(self, name='default'):
        # create a Logger with custom handlers
        # ...

main_logger = Logger('main_logger')
another_topic_logger = Logger('another_topic_logger')

module_a.py

from logger import main_logger
main_logger.info('hello!')

Как Python справляется с этим фон? Нужна ли мне оболочка синглтона или это нормально?

1 Ответ

2 голосов
/ 30 апреля 2020

Это просто отлично. Но зачем вам разные классы регистраторов?

В 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...