2013-04-20 96 views
23

我不打算打开dangerous debugging console,但我的应用程序正在收到500错误,似乎没有写任何输出供我深入调查。简单的应用程序日志记录/调试与nginx,uwsgi,烧瓶?

我看到了this exchange on the mailing list,这导致我to this page on logging errors

不过,我还是觉得这很混乱,有几个问题:

(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__.pyconfig.pyrun.py? (2)我被那里的选项所淹没,并且不能分辨我应该使用哪一个。我应该打开哪些记录器,使用什么设置来复制本地python服务器当我运行run.py时,我得到stdout?我发现默认的本地输出流非常有用,比页面中的交互式调试器更有用。有没有人有一个模式,他们可以分享设置复制nginx部署这个东西,输出到日志? (3)有什么我需要改变,而不是在烧瓶级别,但在nginx中,例如在我的/etc/nginx/sites-available/appname文件中说,启用日志记录?

UPDATE

具体来说,我正在寻找信息,如我得到的Python程序运行时本地至于为什么,比如说,一个包不能正常工作,或者我的语法错误可能是,或有什么变化没有按” t存在:

$ 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是空白,连我的应用程序错误时出。

我还会补充一点,我已经试过设置调试=在以下几个方面诚然,在__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 
+0

我根据您更新的问题更新了我的答案。 – 2013-04-22 09:26:20

+2

你有没有得到这个解决? – hafichuk 2014-11-10 18:22:05

+0

我没有。无法托管生产机器,放弃了烧瓶。 – Mittenchops 2014-11-16 01:31:41

回答

2
  1. 在其中创建处理程序的一部分,添加到记录器等,应该是if __name__ == '__main__'条款,即你的主入口指向。我认为这将是run.py
  2. 我不知道我能否回答 - 这取决于你想要什么。我建议看看logging tutorial以查看各种可用选项。
  3. 我不相信你需要改变nginx的水平。

更新:您可能希望覆盖捕获的异常的例外条款,如

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

它应该将发生在app.run()中的任何异常的追溯写入日志。

7

config['PROPAGATE_EXCEPTIONS']设置为True在生产环境中运行应用程序时,您希望将回溯记录到日志文件中。 (虽然我没有尝试使用SMTP处理程序,但是..)

1

我知道这是一个非常旧的帖子,但我现在遇到了这个问题,并且花了我一点时间才找到解决方案。 Flask向服务器发送错误。我跑Gunicorn在Ubuntu 14.04 LTS新贵脚本,并在那里我发现错误日志的位置如下:

/var/log/upstart/myapp.log

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

万一其他一些可怜的灵魂在结束了这个情况。