Я не могу понять, почему Django
начал заходить в консоль. Когда я запускаю сервер django
(в PyCharm
), в той же консоли есть записи журнала.
Я недавно установил свой форк 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)>}
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 defaultFormatter
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
.
Более того, если я попробую второй вариант, Django больше не регистрирует миграции, а pysendpulse делает это. Думаю, должен быть общий источник проблемы.
Можете ли вы показать мне регистраторы, настроенные в контексте runserver
? print(logging.root)
и print(logging.Logger.manager.loggerDict)
.
Я добавил вывод из shell_plus
в конец вопроса (надеюсь, все в порядке).
Да, спасибо... и вау... это много регистраторов, которые у вас есть. Мне было бы интересно посмотреть, сколько обработчиков у корневого регистратора: print(logging.root.handlers)
. Это вывод с вызовом logging.basicConfig
в pysendpulse.__init__.py
или без него? Какой из них является регистратором pysendpulse
, который регистрирует миграции django, если корневой обработчик удален? Я тоже хочу увидеть print(logging.getlogger(<pysendpulse logger name>).parent)
и print(logging.getlogger('django').parent)
, пожалуйста. Очень странно, что посторонний регистратор должен получать сообщения, т.е.
Он даже регистрируется в shell_plus, когда я использую TAB. Я собираюсь проверить эти регистраторы.
Это точно эта строчка logging.basicConfig(format='%(levelname)-8s [%(asctime)s] %(message)s', level=logging.DEBUG)
когда я ее комментирую, все работает как и прежде.
@Milano Это тот, что в pysendpulse.__init__.py
, верно? Разве вы не указали в своем первом комментарии, что комментирование этой строки (третий вариант, который я предложил, хотя я рекомендовал его удалить) работало только частично?
Я сделал, извините, не знаю, почему он работает правильно сейчас :)
@Milano :D колдовство и черная магия! Круто, что в итоге получилось. Я всерьез начал задаваться вопросом, какой еще пакет может настроить ведение журнала, кроме pysendpulse
.
Спасибо @shmee, я использовал третий вариант, и он частично работает, но, что очень странно, все еще есть две последние записи журнала из моего примера (миграционные). Остальные исчезли. Было бы огромным совпадением, если бы было два совершенно разных источника этой проблемы, потому что я никогда не сталкивался с таким поведением.