Вход в Django на Heroku не появляется
Я создал приложение на Heroku, и я нажимаю на него приложение Django.
Я отслеживаю журналы с помощью heroku logs --tail
, чтобы видеть их в режиме реального времени.
Затем в моем settings.py
у меня есть следующее:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': ('%(asctime)s [%(process)d] [%(levelname)s] ' +
'pathname=%(pathname)s lineno=%(lineno)s ' +
'funcname=%(funcName)s %(message)s'),
'datefmt': '%Y-%m-%d %H:%M:%S'
},
'simple': {
'format': '%(levelname)s %(message)s'
}
},
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'verbose',
'stream': sys.stdout,
}
},
'loggers': {
'MYAPP': {
'handlers': ['console'],
'level': 'INFO',
}
}
}
Затем, когда я хочу что-то записать, я использую следующее:
import logging
import sys
logger = logging.getLogger('MYAPP')
logger.info('My message here...')
sys.stdout.flush()
но это не отражено в моих журналах.
Мой Procfile
:
web: gunicorn myapp.wsgi --log-file=-
EDIT: Любопытно, что я могу изменить "myapp" на "django", когда я определяю конфигурацию журнала, а также logging.getLogger('django')
, и это позволяет мне видеть что-либо, используя print
в моих журналах, но ничего из отформатированного регистратора Я определил.
У меня даже есть PYTHONUNBUFFERED=true
и DEBUG=1
для моей промежуточной среды, но я не вижу ни одного из журналов, которые я вижу при использовании моей локальной версии с foreman start web
.
Что вызывает это и как я вижу, что мои журналы живут в Heroku?
Ответы
Ответ 1
Возможно, ваш файл Procfile находится под витком:
Если вы хотите, чтобы журнал gunicorn в stdout вы использовали параметр командной строки --logfile=-
(вам не хватает =
!) в соответствии с этим ответом.
Итак, ваш весь Procfile должен выглядеть так:
web: gunicorn myapp.wsgi --log-file=-
EDIT:
Поскольку операторы печати работают на вас, но регистрация не выполняется, возможно, ваша настройка ведения журнала виновата. Убедитесь, что вы установили ведение журнала во время запуска вашего приложения (где вы вызываете dictConfig в своем коде?):
import logging
logging.config.dictConfig(LOGGING)
logger = logging.getLogger('MYAPP')
logger.info("Just testing")
Ответ 2
Конфигурация Procfile
и LOGGING
выглядит хорошо. Django настраивает регистратор непосредственно перед импортом приложений, поэтому, если вы попытаетесь выполнить запись еще до того, как (например, из файла settings.py), это не сработает.
EDIT:
LOGGING
config:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': ('%(asctime)s [%(process)d] [%(levelname)s] '
'pathname=%(pathname)s lineno=%(lineno)s '
'funcname=%(funcName)s %(message)s'),
'datefmt': '%Y-%m-%d %H:%M:%S'
},
'simple': {
'format': '%(levelname)s %(message)s'
}
},
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'verbose'
}
},
'loggers': {
'ex_logger': {
'handlers': ['console', ],
'level': 'INFO',
}
}
}
добавление следующего в settings.py
не будет записываться:
import logging
logger = logging.getLogger('ex_logger')
logger.info("core.settings logger") # won't work
добавление в views.py
должно вести журнал:
from django.http import HttpResponse
import logging
logger = logging.getLogger('ex_logger')
logger.info("core.views logger") # should work
def url_please(request):
logger.info("path: %s" % request.path) # should work
return HttpResponse(request.path)
Ответ 3
Как указано в предыдущих ответах, регистратор должен быть настроен в точке входа в ваше приложение. В случае веб-сервера на основе django, использующего gunicorn, эта точка входа, скорее всего, является файлом wsgi.py
.
Попробуйте добавить необходимую конфигурацию к этому файлу, например. установка глобального базового регистратора:
import logging
import os
from dj_static import Cling
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "path.to.settings.py")
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(name)s %(levelname)-8s %(message)s",
)