2015-08-26 5 views
14

Я создал приложение на Heroku, и я нажимаю на него приложение Django.Вход в Django на Heroku не отображается

Я отслеживаю журналы, используя 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» в «Джанго», когда я определяю мое протоколирование конфигурации, а также logging.getLogger('django') и что позволяет мне видеть что-либо с помощью print в моих журналах , но ничего из форматированного регистратора, который я определил.

У меня даже есть PYTHONUNBUFFERED=true и DEBUG=1 набор для моей промежуточной среды, но я не вижу какой-либо из журналов, которые я вижу при использовании моей локальной версии с foreman start web.

Что вызывает это и как я вижу свои журналы в Ироку?

+0

что вы, Procfile? С помощью Gunicorn вы можете указать уровень журнала и файл журнала. – pchiquet

+0

Как запустить приложение на Heroku? С uWSGI или Gunicorn или что-то еще? – rkrzr

+0

my 'Procfile' is:' web: gunicorn myapp.wsgi --log-file - ' – lollercoaster

ответ

7

Ваш PROCFILE, вероятно, виноват здесь:

Если вы хотите иметь gunicorn войти на стандартный вывод, вы должны использовать опцию строки --logfile=- команды (вам не хватает =!) В соответствии с this answer.

Так весь ваш PROCFILE должен выглядеть следующим образом:

web: gunicorn myapp.wsgi --log-file=-

EDIT:

Поскольку операторы печати работают для вас, но регистрация не является, ваша установка каротаж, вероятно, неисправен. Убедитесь, что вы установили ведение журнала во время запуска вашего приложения (где вы звоните dictConfig в вашем коде?):

import logging 
logging.config.dictConfig(LOGGING) 
logger = logging.getLogger('MYAPP') 
logger.info("Just testing") 
+0

Хм, похоже, это не помогает. Я до сих пор не вижу результат в реальном времени в журнале 'heroku logs -tail'. – lollercoaster

+0

@lollercoaster, какую версию Gunicorn вы используете? Начиная с версии R20, он снова записывается в стандартный вывод stdout. Таким образом, вам вообще не нужен флаг командной строки. Также попробуйте добавить '--log-level = debug', чтобы убедиться, что это не проблема. – rkrzr

+0

Я использую 'gunicorn == 19.3.0', это то, что геройку использует для стека django. – lollercoaster

1

Ваш Procfile и LOGGING конфигурация выглядит отлично. Django настраивает регистратор непосредственно перед импортом приложений, поэтому, если вы попытаетесь выполнить запись еще до того, как (например, из файла settings.py), это не сработает.

EDIT:

LOGGING конфигурации:

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) 
0

Как указано в предыдущих ответах, регистратор должен быть настроен в точке входа в приложение. В случае веб-сервера на основе 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", 
) 
Смежные вопросы