利用tornado write_error()方法異常提醒

tornado項目中實現出現異常就提醒(如郵件提醒)機制並跳轉到錯誤頁面。

看一下tornado原來的實現。

web.py
write_error()

debug=True時,會直接返回給瀏覽器錯誤信息;debug=False返回包含錯誤碼的html字符串。

ps: 在Application中有如下邏輯:
Application


嘗試新建BaseHandler並重寫write_error()方法,其他handler都繼承BaseHandler

DEBUG = False
SEND_ERROR_MAIL = True

class BaseHandler(tornado.web.RequestHandler):
    def exception_nofity(self, status_code, error_trace_list):
        if SEND_ERROR_MAIL:
            print('send mail...')


    def write_error(self, status_code, **kwargs):
        error_trace_list = traceback.format_exception(*kwargs.get("exc_info"))

        if DEBUG:
            # from web.py
            # in debug mode, try to send a traceback
            self.set_header('Content-Type', 'text/plain')
            for line in error_trace_list:
                self.write(line)
            self.finish()
        else:

            self.exception_nofity(status_code, error_trace_list)

            # by status_code
            if status_code == 500:
                self.render('500.html')
                return

            if status_code == 403:
                self.write('sorry, request forbidden!')
                return

            self.render('error.html')

        return
  1. exception_nofity()方法中可以分析異常信息以及handler中的sessioncookies和請求參數等,處理後記錄在數據庫。
  2. 在memcached中設置新郵件標誌位爲1。
  3. 另起一個錯誤郵件發送的進程,若memcached中有新郵件標誌, 先改變memcached新郵件標誌位, 再查詢數據庫,返回一定數量的未發送郵件,併發送。(先改緩存再取數據庫,否則可能後面的新的錯誤信息郵件存入數據庫後會無法及時發送。)
  4. 改變已發送郵件數據庫狀態。

ps: 或直接異步發送?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章