2009-11-30 32 views
0

我在django中使用基本的python logger,它似乎很好。我在我的setting.py中設置了日誌記錄爲;python在django中登錄

logging.baseConfig(level = logging.NOTSET,  
        format='a format',  
        datemt=' a datefmt',  
        filename='path to log',  
        filemode = 'a')  
logging.getLogger('').setLevel(logging.NOTSET)  

我的問題是關於傳播異常。在我的代碼中,如果我有一個try/except子句並捕獲異常,以便我可以記錄它,那麼傳播該錯誤的最佳方法是什麼,以便我可以重定向到我的500頁。我一直在使用

try: 
    do stuff 
except Exception, e: 
    logging.error(e) 
    raise 

,但我覺得這會導致被記錄兩次exeption。有沒有另外一種方法來做到這一點,或者我做錯了什麼?

問候
安德魯

回答

1

沒有必要捕捉異常只是這樣你就可以登錄了。你可以登錄並處理它,或者讓它冒泡到更高的級別,然後登錄並處理它。如果您想記錄某些您不想處理的視圖中發生的異常,那麼您可以安裝一些記錄該異常的exception middleware,並返回您確定的自定義響應,或者返回None(以返回Django會響應的任何響應通常返回)。

有可擴展的異常中間件here,這實際上不使用日誌記錄的例子,但其log_exception()方法,你可以繼承來記錄片斷爲導向,以提供自己的異常中間件異常,或者只是使用 - 它基本上只是有方法的類名爲process_exception

class MyExceptionMiddleware: 

    def process_exception(self, request, exception): 
     #Do your logging here 

另外,注意記錄儀有一個exception()方法,它的工作原理是error()但包括在日誌中的跟蹤信息。

0

有一個偏方:http://code.activestate.com/recipes/466332/

在任何比較複雜的應用程序,你可能要記錄和處理大多數異常。該配方顯示了一種將日誌與處理分開的方法,因此不必在每個try-except子句中顯式調用日誌記錄機制。