2011-11-08 54 views
19

我想檢查特定後臺文件中的錯誤,但標準錯誤流由程序在前臺控制,並且問題中文件中的錯誤不是正在顯示。不過,我可以使用logging模塊並將輸出寫入文件。我想知道如何使用它來記錄所有異常,錯誤和回溯。使用python的日誌記錄模塊記錄所有異常和錯誤

+0

[登錄在未捕獲異常的可能的複製Python](http://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python) –

回答

40

在程序中拋出任何異常可能是一個壞主意,因爲Python對正常控制流也使用異常。

因此,您應該只記錄未捕獲的異常。一旦你有一個異常對象,你可以使用記錄器的exception() method輕鬆做到這一點。

要處理所有未捕獲的異常,你可以換你的腳本的入口點在try...except塊,或者通過安裝自定義異常處理程序重新分配sys.excepthook()

import logging 
import sys 

logger = logging.getLogger('mylogger') 
# Configure logger to write to a file... 

def my_handler(type, value, tb): 
    logger.exception("Uncaught exception: {0}".format(str(value))) 

# Install exception handler 
sys.excepthook = my_handler 

# Run your main script here: 
if __name__ == '__main__': 
    main() 
+0

謝謝!這正是我需要的。 –

+0

將'sys.__ excepthook __(type,value,tb)'追加到'my_handler'中不是個好主意,因此它可以處理異常的默認操作? – troyane

+2

@ Ferdinand Beyer:整潔。有'logger.exception(「未捕獲的異常:{0}:{1}」。格式(str(value .__ class __.__ name__),str(value)))'在我的情況下給'ERROR - 未捕獲的異常:IndexError:list索引超出範圍「,並由於某種原因打印出」無「。我如何獲得完整的追溯? 'tb'似乎是一個追蹤對象,但是'traceback.print_tb(tb)'也只是吐出'None'。 – bioslime