標籤:code std process 處理 tor 記憶體耗盡 意義 變化 http
#申明:本文章參考於http://www.cnblogs.com/dahu-daqing/p/7040764.html
logging模組簡介
# logging模組是python內建的標準模組,主要用於輸出程式的作業記錄# 可以設定輸出日誌的等級,日誌儲存路徑,記錄檔復原等# 比print具有如下優點# 1.可以設定不同的日誌等級,只輸出重要訊息,而不必顯示大量的調試資訊# 2.print將所有資訊都輸出到標準輸出中,嚴重開發人員從標準輸出中查看其它資料,而logging模組可以讓開發人員決定將資訊輸出到什麼地方,以及怎麼輸出
logging模組的基本使用
import logginglogging.basicConfig( level=logging.INFO, # 這句可要可不要,真正有用的是下面的logger.setLevel(level) format=‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)logger = logging.getLogger(‘satori‘)logger.setLevel(logging.INFO) # 這裡設定成infologger.info(‘古明地盆‘)logger.debug(‘芙蘭朵露斯卡雷特‘)logger.warning(‘古明地戀‘)logger.info(‘mmp‘)# 運行程式,控制台輸出‘‘‘2018-06-05 14:12:20,160 - satori - INFO - 古明地盆2018-06-05 14:12:20,160 - satori - WARNING - 古明地戀2018-06-05 14:12:20,160 - satori - INFO - mmp‘‘‘# logging中可以選擇很多訊息層級,如debug,info,warning,error,critical。# 通過賦予logger或者handler不同的層級,開發人員就可以只輸出錯誤資訊到特定的記錄檔案,或者在調試時只記錄調試資訊# 例如我們可以將logger的層級改成debuglogging.basicConfig( #level=logging.DEBUG, # 將該句注釋掉 format=‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)logger = logging.getLogger(‘satori‘)logger.setLevel(logging.DEBUG) # 在這裡設定,發現並不影響程式的運行結果logger.info(‘古明地盆‘)logger.debug(‘芙蘭朵露斯卡雷特‘)logger.warning(‘古明地戀‘)logger.info(‘mmp‘)# 運行程式,輸出結果‘‘‘2018-06-05 14:12:20,160 - satori - INFO - 古明地盆2018-06-05 14:12:20,160 - satori - DEBUG - 芙蘭朵露斯卡雷特2018-06-05 14:12:20,160 - satori - WARNING - 古明地戀2018-06-05 14:12:20,160 - satori - INFO - mmp‘‘‘
將日誌寫入到檔案
# logging.basicConfig函數各參數:# filename:指定記錄檔名;# filemode:和open函數意義相同,指定記錄檔的開啟模式,‘w‘或者‘a‘;# format:指定輸出的格式和內容,format可以輸出很多有用的資訊# 參數# %(levelno)s:列印記錄層級的數值# %(levelname)s:列印記錄層級的名稱# %(pathname)s:列印當前執行程式的路徑,其實就是sys.argv[0]# %(filename)s:列印當前執行程式名# %(funcName)s:列印日誌的當前函數# %(lineno)d:列印日誌的當前行號# %(asctime)s:列印日誌的時間# %(thread)d:列印線程ID# %(threadName)s:列印線程名稱# %(process)d:列印進程ID# %(message)s:列印日誌資訊# datefmt:指定時間格式,同time.strftime();# level:設定記錄層級,預設為logging.WARNNING;# stream:指定將日誌的輸出資料流,可以指定輸出到sys.stderr,sys.stdout或者檔案,預設輸出到sys.stderr,當stream和filename同時指定時,stream被忽略import logging# 設定logging,建立一個filehandler,並對輸出訊息的格式進行設定,將其添加到logger中,然後將日誌寫入到指定的檔案中logger = logging.getLogger(‘古明地盆‘) # 隨便起什麼名字logger.setLevel(logging.INFO) # 設定日誌等級# 使用logging.filehandler,說白了類似於open,建立一個log.txt檔案,handler為檔案描述符,就類似於f=open()中的fhandler = logging.FileHandler(‘log.txt‘,mode=‘a‘,encoding=‘utf-8‘)# 為檔案設定日誌等級handler.setLevel(logging.INFO)# 用logging建立輸出的格式formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)# 將格式交給handler,等於handler把格式給吞掉了handler.setFormatter(formatter)# handler作為檔案控制代碼,已經設定好等級,又吞掉了logging設定好的formatter格式。# 此時的handler已經準備就緒,再讓它被logger吞掉,此時的logger已經完善,便可開始列印日誌。logger.addHandler(handler)# 關於設定等級,logger設定一次,handler又設定了一次。# 設定兩次不影響,可以將兩個等級都設定一樣,如果一方等級設定過高,即使另一方等級設定不高,那麼也不會輸出# 可以將等級設定一樣,保持一致logger.info(‘古明地盆‘)logger.debug(‘芙蘭朵露斯卡雷特‘)logger.warning(‘古明地戀‘)logger.info(‘mmp‘)# 執行程式,可以看到有一個txt檔案,檔案內容為‘‘‘2018-06-05 14:23:27,767 - 古明地盆 - INFO - 古明地盆2018-06-05 14:23:27,767 - 古明地盆 - WARNING - 古明地戀2018-06-05 14:23:27,767 - 古明地盆 - INFO - mmp‘‘‘
將日誌同時輸出到檔案和控制台
# logging中添加StreamHandler,可以將日誌輸出到螢幕上import logginglogger = logging.getLogger(‘古明地盆‘)logger.setLevel(level=logging.INFO)handler = logging.FileHandler(‘log1.txt‘,‘a‘,encoding=‘utf-8‘)handler.setLevel(logging.INFO)formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)handler.setFormatter(formatter)# 輸出到控制台console = logging.StreamHandler() # 由於是輸出到控制台,所不需要參數console.setLevel(logging.INFO) # 如果不指定格式,那麼只輸出普通的字串console.setFormatter(formatter) # 指定格式,按照格式輸出logger.addHandler(console)logger.addHandler(handler)logger.info(‘古明地盆‘)logger.debug(‘芙蘭朵露斯卡雷特‘)logger.warning(‘古明地戀‘)logger.info(‘mmp‘)# 輸出結果,可以看到txt檔案和控制台都會輸出如下‘‘‘2018-06-05 19:10:11,995 - 古明地盆 - INFO - 古明地盆2018-06-05 19:10:11,995 - 古明地盆 - WARNING - 古明地戀2018-06-05 19:10:11,995 - 古明地盆 - INFO - mmp‘‘‘# 一些錯誤的等級‘‘‘FATAL:致命錯誤CRITICAL:特別糟糕的事情,如記憶體耗盡、磁碟空間為空白,一般很少使用ERROR:發生錯誤時,如IO操作失敗或者串連問題WARNING:發生很重要的事件,但是並不是錯誤時,如使用者登入密碼錯誤INFO:處理請求或者狀態變化等日常事務DEBUG:調試過程中使用DEBUG等級,如演算法中每個迴圈的中間狀態‘‘‘
python--logging模組