Как увидеть вывод журнала Heroku и результат выполнения во время работы python

Я работаю над веб-приложением на Python с Heroku, и я не могу понять, как эффективно протестировать его. Я пытался использовать print (...) и sys.stdout.write(...), но я никогда не вижу никакого вывода, когда я запускаю локально с "стартом мастера" или когда я развертываю в облаке и запускаю "журналы героя", чтобы увидеть облачные журналы. Кроме того, я не могу понять, как отлаживать ошибки времени выполнения python, например, когда возникает исключение. Веб-запрос для приложения возвращает HTTP 500, но у меня нет способа отладки, чтобы увидеть, откуда возникло исключение. Есть ли способ увидеть эту информацию?

Ответ 1

Добавление sys.stdout.flush() после того, как операторы печати решили эту проблему для меня.

В моем случае проблема заключалась в том, что stdout буферизуется, а stderr - нет.

Если вы даже не видите исключения через foreman start, убедитесь, что на самом деле вы нажимаете на свой сервер на правильном IP/PORT. Вы должны увидеть записи доступа HTTP (например, GET/index.html) на выходе из foreman start.

Кроме того, вы можете попробовать использовать веб-фреймворк для работы в режиме отладки - большинство современных фреймворков будут показывать стеки в браузере в режиме debug/dev. Использование колбы? app.config['DEBUG'] = True или app.run(..., debug=True).

# logging helper
def p(*args):
  print args[0] % (len(args) > 1 and args[1:] or [])
  sys.stdout.flush()

Ответ 2

Если вы используете Foreman для запуска проекта Python, и вам не удается увидеть stdout/stderr, вот несколько решений для вас. Если вы используете Procfile для непосредственного вызова CLI python, вы можете использовать опцию '-u', чтобы избежать буферизации stdout:

python -u script.py

Если вы используете Procfile для управления WSGI-сервером, например, вызывая gunicorn, флягу, бутылку, канун и т.д., вы можете добавить файл ".env" в корень вашего проекта python, содержащий следующие

PYTHONUNBUFFERED=True

Также см. ответы на этот вопрос: мастер только показывает строку с "start wit pid #" и ничего больше

Ответ 3

Примечание для любых других начинающих Django/Python. Не забудьте добавить

import sys

и что-то вроде этого

print ("hello world") # python 3
sys.stdout.flush()

распечатает на консоль.

Переход с PHP на Py/Dj KISS может быть редким.