標籤:結構 icc str for stream 無法 logging 形式 display
一、包的使用
1.什麼是包
包就是一個包含有__init__.py檔案的檔案夾
包本質就是一種模組,即包是用包匯入使用的,包內部包含的檔案也都是用來被匯入使用的
2.為何要用包
包的本質就是一個檔案夾,那麼檔案夾唯一的功能就是講檔案組織起來
隨著功能越寫越多,我們無法將所有功能都放到一個檔案中,於是我們使用模組去組織功能,而隨著模組越來越多,我們就需要用檔案夾將模組檔案組織起來,以此來提高程式的結構性和可維護性
首次匯入包,發生三件事
1.以包下的__init__.py檔案為基準來產生一個名稱空間
2.執行包下的__init__.py檔案的代碼,將執行過程中產生的名字都丟到名稱空間中
3.在當前執行檔案中拿到一個名字p1,該p1就是指向__init__.py名稱空間的
3.注意
在python2中,包下必須有一個__init__.py,而python3中即便是沒有也不會報錯
但凡是在匯入語句中帶點的,點的左邊都必須是一個包
匯入包就是在導包下的__init__.py檔案
如果使用絕對匯入,絕對匯入的起始位置都是以包的頂級目錄為起始點
但是包內部模組的匯入通常應該使用相對匯入,用.代表當前所在的檔案夾(而非執行檔案),..代表上一級
強調:
相對匯入只能包內部的模組之間互相匯入
..上一級不能超出頂級包
二、logging模組
1.記錄層級
CRITICAL=50ERROR=40WARNING=30 #預設層級INFO=20DEBUG=10NOTEST=0
2.logging模組指定全域配置,針對所有logger有效,控制列印到檔案中
#======介紹可在logging.basicConfig()函數中可通過具體參數來更改logging模組預設行為,可用參數有filename:用指定的檔案名稱建立FiledHandler(後邊會具體講解handler的概念),這樣日誌會被儲存在指定的檔案中。filemode:檔案開啟檔案,在指定了filename時使用這個參數,預設值為“a”還可指定為“w”。format:指定handler使用的日誌顯示格式。datefmt:指定日期時間格式。level:設定rootlogger(後邊會講解具體概念)的記錄層級stream:用指定的stream建立StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者檔案,預設為sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。format參數中可能用到的格式化串:%(name)s Logger的名字%(levelno)s 數字形式的記錄層級%(levelname)s 文本形式的記錄層級%(pathname)s 調用日誌輸出函數的模組的完整路徑名,可能沒有%(filename)s 調用日誌輸出函數的模組的檔案名稱%(module)s 調用日誌輸出函數的模組名%(funcName)s 調用日誌輸出函數的函數名%(lineno)d 調用日誌輸出函數的語句所在的程式碼%(created)f 目前時間,用UNIX標準的表示時間的浮 點數表示%(relativeCreated)d 輸出日誌資訊時的,自Logger建立以 來的毫秒數%(asctime)s 字串形式的目前時間。預設格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒%(thread)d 線程ID。可能沒有%(threadName)s 線程名。可能沒有%(process)d 進程ID。可能沒有%(message)s使用者輸出的訊息#========使用import logginglogging.basicConfig(filename=‘access.log‘, format=‘%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s‘, datefmt=‘%Y-%m-%d %H:%M:%S %p‘, level=10)logging.debug(‘調試debug‘)logging.info(‘訊息info‘)logging.warning(‘警告warn‘)logging.error(‘錯誤error‘)logging.critical(‘嚴重critical‘)#========結果access.log內容:2017-07-28 20:32:17 PM - root - DEBUG -test: 調試debug2017-07-28 20:32:17 PM - root - INFO -test: 訊息info2017-07-28 20:32:17 PM - root - WARNING -test: 警告warn2017-07-28 20:32:17 PM - root - ERROR -test: 錯誤error2017-07-28 20:32:17 PM - root - CRITICAL -test: 嚴重criticalpart2: 可以為logging模組指定模組層級的配置,即所有logger的配置
View Code
3.logging模組的Formatter,Handler,Logger,Filter對象
logger:產生日誌的對象
Filter:過濾日誌的對象
Handler:接受日誌然後控制列印不到不同的地方,FileHandler用來列印到檔案中,Streamhandler用來列印到終端
Formatter:可以定製不同的日誌格式對象,然後綁定給不同的Handler對象使用,以此來控制不同的Handler的日誌格式
‘‘‘critical=50error =40warning =30info = 20debug =10‘‘‘import logging#1、logger對象:負責產生日誌,然後交給Filter過濾,然後交給不同的Handler輸出logger=logging.getLogger(__file__)#2、Filter對象:不常用,略#3、Handler對象:接收logger傳來的日誌,然後控制輸出h1=logging.FileHandler(‘t1.log‘) #列印到檔案h2=logging.FileHandler(‘t2.log‘) #列印到檔案h3=logging.StreamHandler() #列印到終端#4、Formatter對象:日誌格式formmater1=logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s‘, datefmt=‘%Y-%m-%d %H:%M:%S %p‘,)formmater2=logging.Formatter(‘%(asctime)s : %(message)s‘, datefmt=‘%Y-%m-%d %H:%M:%S %p‘,)formmater3=logging.Formatter(‘%(name)s %(message)s‘,)#5、為Handler對象綁定格式h1.setFormatter(formmater1)h2.setFormatter(formmater2)h3.setFormatter(formmater3)#6、將Handler添加給logger並設定記錄層級logger.addHandler(h1)logger.addHandler(h2)logger.addHandler(h3)logger.setLevel(10)#7、測試logger.debug(‘debug‘)logger.info(‘info‘)logger.warning(‘warning‘)logger.error(‘error‘)logger.critical(‘critical‘)
View Code
4.Logger與Handler的層級
logger是第一級過濾,然後才能到handler,在為這兩項順位的時候,最好設定同層級。
Python學習---8.10包的使用及loggin模組