2013-04-20 92 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

萬一其他一些可憐的靈魂在結束了這個情況。