python--logging模塊
阿新 • • 發佈:2018-06-05
.html 輸出 相同 數值 basic size ole logger 錯誤信息
#申明:本文章參考於http://www.cnblogs.com/dahu-daqing/p/7040764.html
logging模塊簡介
# logging模塊是python內置的標準模塊,主要用於輸出程序的運行日誌 # 可以設置輸出日誌的等級,日誌保存路徑,日誌文件回滾等 # 比print具有如下優點 # 1.可以設置不同的日誌等級,只輸出重要信息,而不必顯示大量的調試信息 # 2.print將所有信息都輸出到標準輸出中,嚴重開發者從標準輸出中查看其它數據,而logging模塊可以讓開發者決定將信息輸出到什麽地方,以及怎麽輸出
logging模塊的基本使用
import logging logging.basicConfig( level=logging.INFO, # 這句可要可不要,真正有用的是下面的logger.setLevel(level) format=‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘ ) logger = logging.getLogger(‘satori‘) logger.setLevel(logging.INFO) # 這裏設置成info 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 - WARNING - 古明地戀 2018-06-05 14:12:20,160 - satori - INFO - mmp ‘‘‘ # logging中可以選擇很多消息級別,如debug,info,warning,error,critical。 # 通過賦予logger或者handler不同的級別,開發者就可以只輸出錯誤信息到特定的記錄文件,或者在調試時只記錄調試信息 # 例如我們可以將logger的級別改成debug logging.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()中的f handler = 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 logging logger = 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模塊