Django - внезапный вход в консоль (runserver)

Я не могу понять, почему Django начал заходить в консоль. Когда я запускаю сервер djangoPyCharm), в той же консоли есть записи журнала.

Я недавно установил свой форк pysendpulse, но это может быть совпадением.

INFO     [2019-04-08 00:59:05,331]  Initialization SendPulse REST API Class
DEBUG    [2019-04-08 00:59:05,331]  Try to get security token from 'MEMCACHED'
DEBUG    [2019-04-08 00:59:05,331]  Got: 'some string'
INFO     [2019-04-08 00:59:05,775]  Initialization SendPulse REST API Class
DEBUG    [2019-04-08 00:59:05,775]  Try to get security token from 'MEMCACHED'
DEBUG    [2019-04-08 00:59:05,775]  Got: 'some string'
Performing system checks...

System check identified no issues (0 silenced).
DEBUG    [2019-04-08 00:59:06,025]  (0.001) 
            SELECT c.relname, c.relkind
            FROM pg_catalog.pg_class c
            LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relkind IN ('r', 'v')
                AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
                AND pg_catalog.pg_table_is_visible(c.oid); args=None
DEBUG    [2019-04-08 00:59:06,026]  (0.000) SELECT "django_migrations"."app", "django_migrations"."name" FROM "django_migrations"; args=()
April 08, 2019 - 00:59:06
Django version 2.1.7, using settings 'p.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Например, первая строка записывается отсюда:

logging.info("Initialization SendPulse REST API Class")

настройки.ВЕДЕНИЕ РЕГИСТРАЦИИ

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '{asctime} {levelname} {module} {message}',
            'style': '{',
        },
    },
    'handlers': {
        'local_file_debug': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOG_PATH, 'django_debug.log'),
            'maxBytes': DEFAULT_LOG_SIZE,
            'backupCount': 0,
        },
        'local_file': {
            'level': 'WARNING',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOG_PATH, 'django.log'),
            'maxBytes': DEFAULT_LOG_SIZE,
            'backupCount': 0,
        },
        'pipedrive': {
            'level': 'DEBUG' if DEBUG else 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOG_PATH, 'pipedrive.log'),
            'formatter': 'verbose',
            'maxBytes': DEFAULT_LOG_SIZE,
            'backupCount': 0,
        },
    },
    'loggers': {
        'django': {
            'handlers': ['local_file_debug' if DEBUG else 'local_file'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'pipedrive': {
            'handlers': ['pipedrive'],
            'level': 'DEBUG',
        },
    },
}

Вы знаете, где может быть проблема?

РЕДАКТИРОВАТЬ

оболочка_плюс

печать (регистрация. корень)

<RootLogger root (DEBUG)>

печать (регистрация.Logger.manager.loggerDict)

{'amqp': <Logger amqp (DEBUG)>, 'kombu.connection': <Logger kombu.connection (DEBUG)>, 'kombu': <logging.PlaceHolder object at 0x7f32045565c0>, 'celery': <Logger celery (DEBUG)>, 'celery.task': <Logger celery.task (DEBUG)>, 'celery.worker': <Logger celery.worker (DEBUG)>, 'kombu.common': <Logger kombu.common (DEBUG)>, 'celery.utils.dispatch.signal': <Logger celery.utils.dispatch.signal (DEBUG)>, 'celery.utils.dispatch': <logging.PlaceHolder object at 0x7f3203609898>, 'celery.utils': <logging.PlaceHolder object at 0x7f3203609978>, 'celery.app.builtins': <Logger celery.app.builtins (DEBUG)>, 'celery.app': <logging.PlaceHolder object at 0x7f32036e6c88>, 'celery.app.base': <Logger celery.app.base (DEBUG)>, 'django.template': <Logger django.template (DEBUG)>, 'django': <Logger django (DEBUG)>, 'concurrent.futures': <Logger concurrent.futures (DEBUG)>, 'concurrent': <logging.PlaceHolder object at 0x7f3203267940>, 'asyncio': <Logger asyncio (DEBUG)>, 'django.db.backends': <Logger django.db.backends (DEBUG)>, 'django.db': <logging.PlaceHolder object at 0x7f3202855668>, 'django.request': <Logger django.request (DEBUG)>, 'django.server': <Logger django.server (DEBUG)>, 'pipedrive': <Logger pipedrive (DEBUG)>, 'django.security.csrf': <Logger django.security.csrf (DEBUG)>, 'django.security': <logging.PlaceHolder object at 0x7f32025823c8>, 'django.db.backends.schema': <Logger django.db.backends.schema (DEBUG)>, 'urllib3.util.retry': <Logger urllib3.util.retry (DEBUG)>, 'urllib3.util': <logging.PlaceHolder object at 0x7f31feafb4e0>, 'urllib3': <Logger urllib3 (DEBUG)>, 'urllib3.connection': <Logger urllib3.connection (DEBUG)>, 'urllib3.response': <Logger urllib3.response (DEBUG)>, 'urllib3.connectionpool': <Logger urllib3.connectionpool (DEBUG)>, 'urllib3.poolmanager': <Logger urllib3.poolmanager (DEBUG)>, 'requests': <Logger requests (DEBUG)>, 'superfakura.api': <Logger superfakura.api (DEBUG)>, 'superfakura': <logging.PlaceHolder object at 0x7f31fe527208>, 'p.apps.apis.superfaktura.utils': <Logger p.apps.apis.superfaktura.utils (DEBUG)>, 'p.apps.apis.superfaktura': <logging.PlaceHolder object at 0x7f31fe51c7b8>, 'p.apps.apis': <logging.PlaceHolder object at 0x7f31fe51c860>, 'p.apps': <logging.PlaceHolder object at 0x7f31fe527470>, 'p': <logging.PlaceHolder object at 0x7f31fe527588>, 'p.apps.apis.superfaktura.models': <Logger p.apps.apis.superfaktura.models (DEBUG)>, 'django_bootstrap_breadcrumbs.templatetags.django_bootstrap_breadcrumbs': <Logger django_bootstrap_breadcrumbs.templatetags.django_bootstrap_breadcrumbs (DEBUG)>, 'django_bootstrap_breadcrumbs.templatetags': <logging.PlaceHolder object at 0x7f31fdece2b0>, 'django_bootstrap_breadcrumbs': <logging.PlaceHolder object at 0x7f31fdece2e8>, 'PIL.Image': <Logger PIL.Image (DEBUG)>, 'PIL': <logging.PlaceHolder object at 0x7f31fdea29e8>, 'prompt_toolkit': <Logger prompt_toolkit (DEBUG)>, 'parso.python.diff': <Logger parso.python.diff (DEBUG)>, 'parso.python': <logging.PlaceHolder object at 0x7f31fc597668>, 'parso': <logging.PlaceHolder object at 0x7f31fc597be0>, 'parso.cache': <Logger parso.cache (DEBUG)>, 'TerminalIPythonApp': <Logger TerminalIPythonApp (WARNING)>}
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
177
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

I've recently installed my fork of pysendpulse but it may be a coincidence.

В зависимости от того, как/где вы его разветвили, это не совпадение.
Оригинальный pysendpulse вызывает logging.basicConfig в __init__.py пакета.

logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s', level=logging.DEBUG)

Цель basicConfig - настроить ...

... basic configuration for the logging system by creating a StreamHandler with a default Formatter and adding it to the root logger.

Это делается здесь.

Поскольку вы настраиваете свой регистратор django для распространения (по умолчанию)

'propagate': True,

записи журнала не только обрабатываются вашим выделенным регистратором, но также отправляются по цепочке предков, заканчиваясь регистратором root.

Без импорта pysendpulse регистратор root не имеет прикрепленного обработчика и установлен на уровень по умолчанию WARNING; записи журнала «теряются» (на уровне rootлоггера).
Но вызов logging.basicConfig в pysendpulse прикрепляет StreamHandler к вашему root регистратору и устанавливает его на уровень DEBUG, поэтому вы видите сообщения на своей консоли.

Что касается решений, вы можете либо отключить распространение на вашем регистраторе django

'propagate': False,

удалить StreamHandler из регистратора root

logging.getLogger().removeHandler(logging.getLogger().handlers[0])

или, поскольку вы, по-видимому, разветвили pysendpulse, рассмотрите возможность удаления вызова logging.basicConfig из модуля __init__.py.

Спасибо @shmee, я использовал третий вариант, и он частично работает, но, что очень странно, все еще есть две последние записи журнала из моего примера (миграционные). Остальные исчезли. Было бы огромным совпадением, если бы было два совершенно разных источника этой проблемы, потому что я никогда не сталкивался с таким поведением.

Milano 08.04.2019 14:29

Более того, если я попробую второй вариант, Django больше не регистрирует миграции, а pysendpulse делает это. Думаю, должен быть общий источник проблемы.

Milano 08.04.2019 14:36

Можете ли вы показать мне регистраторы, настроенные в контексте runserver? print(logging.root) и print(logging.Logger.manager.loggerDict).

shmee 08.04.2019 14:44

Я добавил вывод из shell_plus в конец вопроса (надеюсь, все в порядке).

Milano 08.04.2019 14:57

Да, спасибо... и вау... это много регистраторов, которые у вас есть. Мне было бы интересно посмотреть, сколько обработчиков у корневого регистратора: print(logging.root.handlers). Это вывод с вызовом logging.basicConfig в pysendpulse.__init__.py или без него? Какой из них является регистратором pysendpulse, который регистрирует миграции django, если корневой обработчик удален? Я тоже хочу увидеть print(logging.getlogger(<pysendpulse logger name>).parent) и print(logging.getlogger('django').parent), пожалуйста. Очень странно, что посторонний регистратор должен получать сообщения, т.е.

shmee 08.04.2019 15:18

Он даже регистрируется в shell_plus, когда я использую TAB. Я собираюсь проверить эти регистраторы.

Milano 13.04.2019 16:41

Это точно эта строчка logging.basicConfig(format='%(levelname)-8s [%(asctime)s] %(message)s', level=logging.DEBUG) когда я ее комментирую, все работает как и прежде.

Milano 13.04.2019 16:51

@Milano Это тот, что в pysendpulse.__init__.py, верно? Разве вы не указали в своем первом комментарии, что комментирование этой строки (третий вариант, который я предложил, хотя я рекомендовал его удалить) работало только частично?

shmee 13.04.2019 17:03

Я сделал, извините, не знаю, почему он работает правильно сейчас :)

Milano 13.04.2019 17:08

@Milano :D колдовство и черная магия! Круто, что в итоге получилось. Я всерьез начал задаваться вопросом, какой еще пакет может настроить ведение журнала, кроме pysendpulse.

shmee 13.04.2019 17:15

Другие вопросы по теме