2012-02-25 140 views
2

下面的腳本將所有錯誤寫入日誌文件和控制檯,除了僅在控制檯上寫入並且不在日誌中的引發異常外。如何讓它寫出引發的異常記錄或任何運行時異常?謝謝。Python:向控制檯和日誌文件顯示並記錄運行時錯誤

import os 
import sys 
import logging 
import logging.config 

class Main(object): 

    @staticmethod 
    def main(): 
    logging.config.fileConfig("logging.conf") 
    logging.debug("1") 
    logging.info("2") 
    logging.warn("3") 
    logging.error("4") 
    logging.critical("5") 
    raise Exception("test") 

if __name__ == "__main__": 
    Main.main() 


import logging 
import logging.config 

logging.config.fileConfig('logging.conf') 

# create logger 
logger = logging.getLogger('simpleExample') 

# 'application' code 
logger.debug('debug message') 
logger.info('info message') 
logger.warn('warn message') 
logger.error('error message') 
logger.critical('critical message') 
raise Exception("Exception raised") 

配置文件:

[loggers] 
keys=root,simpleExample 

[handlers] 
keys=consoleHandler 

[formatters] 
keys=simpleFormatter 

[logger_root] 
level=DEBUG 
handlers=consoleHandler 

[logger_simpleExample] 
level=DEBUG 
handlers=consoleHandler 
qualname=simpleExample 
propagate=0 

[handler_fileHandler] 
formatter=simpleFormatter 
args=('error.log') 

[handler_consoleHandler] 
class=StreamHandler 
level=DEBUG 
formatter=simpleFormatter 
args=(sys.stdout,) 

[formatter_simpleFormatter] 
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s 
datefmt= 
+0

您是否正在使用FileHandler將日誌輸出到日誌文件? – Phani 2012-02-25 05:16:17

+0

對不起,我只是添加了文件處理程序,但同樣的問題。 – Bass 2012-02-25 05:36:53

+0

無法記錄運行時錯誤。你需要先回答他們,如答案中所述。 – Phani 2012-02-25 05:39:10

回答

7

爲了讓使用logging模塊捕獲的所有錯誤,第一個要求是給你用,除了聲明趕上他們。一旦你捕捉到它們,你就必須根據錯誤的級別調用Logger.exception()或其他合適的函數。

如果您不能預先捕獲所有異常,最好的辦法是將stdoutstderr重定向到一個文件。然後,執行tail -f模擬控制檯輸出。無論如何,一個未捕獲的異常將導致程序執行被停止。

但是,我寧願試圖捕捉所有異常,即使這意味着必須做這樣的事情。

try: 
    Main.main() 
except Exception as e: 
    logging.Exception("Unexpected exception! %s",e) 

這使您可以使用,而不必依賴於蹩腳的輸出重定向整齊logging模塊。

+0

感謝您的快速反饋。目標是使用更靈活的日誌記錄模塊。我試圖避免使用嘗試/除了整個主,因爲我想有更多的控制處理異常。有沒有辦法通過配置文件管理運行時錯誤日誌和控制檯? – Bass 2012-02-25 05:45:13

+0

無論如何,任何運行時錯誤都會導致整個程序停止運行。所以,除非你發現這個例外,否則沒有什麼可做的。但是,如果你使用'Logger.exception()',你也會得到回溯,所以它和獲得運行時錯誤一樣好。這可以在main()上完成。你仍然能夠追蹤錯誤,因爲追溯 – Phani 2012-02-25 05:51:00

+0

問題在這裏,我想拋出一些異常並從其他人身上恢復。所以在main中使用全局異常可能不是一個好主意。另外,主要方法在其他文件中調用許多其他函數,所以try/except可能不會覆蓋它們。我想記錄運行時異常的原因是因爲我的應用程序作爲Web服務運行,所以如果用戶發出請求並且由於生產者運行時錯誤而沒有得到響應,那麼我可以輕鬆排除故障。 – Bass 2012-02-25 06:48:52

相關問題