Подтвердить что ты не робот

Легкая регистрация/отладка приложений с помощью nginx, uwsgi, flask?

Я не хочу включать опасную консоль отладки, но мое приложение получает 500 ошибок и, похоже, не пишет для меня никакой вывод исследовать более глубоко.

Я видел этот обмен в списке рассылки, который привел меня на эту страницу при ошибках регистрации.

Однако я все еще считаю это очень запутанным и имею пару вопросов:

(1) В каком файле должен находиться материал ниже?

ADMINS = ['[email protected]']
if not app.debug:
    import logging
    from logging.handlers import SMTPHandler
    mail_handler = SMTPHandler('127.0.0.1',
                               '[email protected]',
                               ADMINS, 'YourApplication Failed')
    mail_handler.setLevel(logging.ERROR)
    app.logger.addHandler(mail_handler)

... предполагая, что шаблон "получить больше" для более крупных приложений? __init__.py? config.py? run.py?

(2) Я перегружен опциями там и не могу сказать, что я должен использовать. Какие регистраторы я должен включить, с какими настройками, чтобы реплицировать локальный отладчик сервера python? Я получаю stdout при запуске run.py? Я считаю, что поток по умолчанию, локальный выходной поток очень полезен, более того, чем интерактивный отладчик на странице. У кого-нибудь есть шаблон, который они могли бы использовать при создании чего-то, дублирующего это с помощью развертывания nginx, выводящего журнал?

(3) Есть ли что-то, что мне нужно изменить, а не на уровне фляжки, но в nginx, скажем, в моем /etc/nginx/sites-available/appname файле, чтобы включить ведение журнала?

UPDATE

В частности, я ищу информацию, которую я получаю, когда python запускается локально в отношении того, почему, скажем, пакет не работает или где моя синтаксическая ошибка может быть, или какая переменная не существует:

$ python run.py 
Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from myappname import app
  File "/home/me/myappname/myappname/__init__.py", line 27, in <module>
    file_handler.setLevel(logging.debug)
  File "/usr/lib/python2.7/logging/__init__.py", line 710, in setLevel
    self.level = _checkLevel(level)
  File "/usr/lib/python2.7/logging/__init__.py", line 190, in _checkLevel
    raise TypeError("Level not an integer or a valid string: %r" % level)

Когда я запускаю колбу на сервере, я никогда этого не вижу. Я просто получаю ошибку uWSGI в браузере и не знаю, какой код был проблематичным. Я бы просто хотел, чтобы что-то вроде этого было записано в файл.

Я также отмечаю, что установка следующего ведения журнала на самом деле не сильно писала в файл, даже когда я поворачиваю путь журнала до уровня DEBUG:

from logging import FileHandler
file_handler = FileHandler('mylog.log')
file_handler.setLevel(logging.DEBUG)
app.logger.addHandler(file_handler)

mylog.log пуст, даже когда мои ошибки приложения отсутствуют.

Я также добавлю, что я попытался установить debug = True следующими способами: __init__.py:

app = Flask(__name__)
app.debug = True
app.config['DEBUG'] = True
from werkzeug.debug import DebuggedApplication
app.wsgi_app = DebuggedApplication(app.wsgi_app, True)
app.config.from_object('config')
app.config.update(DEBUG=True)
app.config['DEBUG'] = True
if __name__ == '__main__':
    app.run(debug=True)

В моем файле config.py у меня есть...

debug = True
Debug = True
DEBUG = True

Тем не менее, отладка не происходит, и без протоколирования или отладки это довольно сложно отследить. Ошибки просто завершают приложение с помощью не полезного сообщения в браузере:

uWSGI Error
Python application not found
4b9b3361

Ответ 1

Установите config['PROPAGATE_EXCEPTIONS'] в True при запуске приложения в процессе производства, и вы хотите, чтобы трассировки записывались в файлы журнала. (Я не пробовал с обработчиком SMTP, хотя..)

Ответ 2

  • Часть, в которой вы создаете обработчики, добавляете к журналам и т.д., должна находиться в предложении if __name__ == '__main__', т.е. в вашей основной точке входа. Я предполагаю, что это будет run.py.
  • Я не уверен, что смогу ответить на этот вопрос - это зависит от того, что вы хотите. Я бы посоветовал посмотреть журнал ведения, чтобы увидеть различные доступные варианты.
  • Я не верю, что вам нужно что-то изменить на уровне nginx.

Обновление: Возможно, вы захотите иметь предложение исключения, которое охватывает неперехваченные исключения, например

if __name__ == '__main__':
    try:
        app.run(debug=True)
    except Exception:
        app.logger.exception('Failed')

который должен записать трассировку любого исключения, произошедшего в app.run(), в журнал.

Ответ 3

Я знаю, что это ОЧЕНЬ старый пост, но я столкнулся с проблемой сейчас, и мне потребовалось немного, чтобы найти решение. Flask отправляет ошибки серверу. Я запускал Gunicorn с выскочкой script на Ubuntu 14.04 LTS, а место, где я нашел журналы ошибок, было следующим:

/var/log/upstart/myapp.log

http://docs.gunicorn.org/en/stable/deploy.html#upstart

На всякий случай какая-то другая бедная душа попадает в эту ситуацию.