包和日誌模塊的使用
一、包
1.包就是一個保護有__init__.py文件的文件夾,包的本質就是一種模塊,即包是用來導入使用的,包內部包含的文件也都是用來被導入使用的.包是為了更好組織好模塊,就是一個文件夾.
註:在python2中,包下必須有一個__init__.py文件,而python3中即便沒有也不會報錯
首次導入包,會發生三件事
1.以包下的__init__.py文件為基準來產生一個名稱空間
2.執行包下的__init__.py文件的代碼,將執行過程中產生的名字都丟到名稱空間中
3.在當前執行文件中拿到一個名字p1,該p1就是指向__init__.py名稱空間的
總結包的使用需要註意的地方:
1.但凡是在導入語句中帶點的,點的左邊都必須是一個包
2.導入包就是在導入包下的__init__.py文件
3.如果使用絕對導入,絕對導入的起始位置都是以包的頂級目錄為起始點
4.但是包內部模塊的導入通常應該使用相對導入,用"."代表當前所在的文件(而非執行文件),兩個點代表上一級
強調:
1.相對導入只能包內部的模塊之間互相導入使用
2. ".."上一級不能超出頂級包
二、日誌模塊的使用
logging模塊主要是用來記錄日誌信息的,需要註意的三點有,控制日誌級別,控制日誌格式,控制輸出的目標為文件
等級:
1.logging.debug("debug日誌") #10
2.logging.info("info日誌") #20
3.logging.warning("warning日誌") #30
4.logging.error("error日誌") #40
5.logging.critical("critical日誌") #50
可在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參數會被忽略。 #格式 %(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:用戶輸出的消息 logging.basicConfig()
#======介紹 可在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 logging logging.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: 調試debug 2017-07-28 20:32:17 PM - root - INFO -test: 消息info 2017-07-28 20:32:17 PM - root - WARNING -test: 警告warn 2017-07-28 20:32:17 PM - root - ERROR -test: 錯誤error 2017-07-28 20:32:17 PM - root - CRITICAL -test: 嚴重critical part2: 可以為logging模塊指定模塊級的配置,即所有logger的配置
logging模塊中的Formatter,Handler,Logger,Filter對象
#logger:產生日誌的對象 #Filter:過濾日誌的對象 #Handler:接收日誌然後控制打印到不同的地方,FileHandler用來打印到文件中,StreamHandler用來打印到終端 #Formatter對象:可以定制不同的日誌格式對象,然後綁定給不同的Handler對象使用,以此來控制不同的Handler的日誌格式
logger是第一級過濾,然後才能到handler,我們可以給logger和handler同時設置level
import logging # 1. logger對象: 負責生產各種級別的日誌 logger1 = logging.getLogger(‘用戶交易‘) # 日誌名用來標識日誌的與什麽業務有關 # 2. filter對象: 過濾日誌 # 3. handler對象: 控制日誌輸出目標位置 fh1 = logging.FileHandler(‘a1.log‘,encoding=‘utf-8‘) fh2 = logging.FileHandler(‘a2.log‘,encoding=‘utf-8‘) ch = logging.StreamHandler() # 4. formmater對象 formatter1 = logging.Formatter( fmt=‘%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s‘, datefmt=‘%Y-%m-%d %H:%M:%S %p‘ ) formatter2 = logging.Formatter( fmt=‘%(asctime)s - %(levelname)s : %(message)s‘, datefmt=‘%Y-%m-%d %H:%M:%S %p‘ ) # 5. 綁定logger對象與handler對象 logger1.addHandler(fh1) logger1.addHandler(fh2) logger1.addHandler(ch) # 6. 綁定handler對象與formatter對象 fh1.setFormatter(formatter1) fh2.setFormatter(formatter1) ch.setFormatter(formatter2) # 7. 設置日誌級別,有logger對象與handler對象兩層關卡,必須都放行最終日誌才會放行,通常二者級別相同 logger1.setLevel(10) fh1.setLevel(10) fh2.setLevel(10) ch.setLevel(10) # 8. 使用logger對象產生日誌 logger1.info(‘alex給egon轉賬1個億‘)
應用:
settings.py
standard_format = ‘%(asctime)s - task:%(name)s - %(filename)s:%(lineno)d -‘ ‘ %(levelname)s : [%(message)s]‘ simple_format = ‘%(filename)s:%(lineno)d - %(levelname)s : [%(message)s]‘ fh1_path = r‘a1.log‘ fh2_path = r‘a2.log‘ # log配置字典 LOGGING_DIC = { ‘version‘: 1, ‘disable_existing_loggers‘: False, ‘formatters‘: { ‘standard‘: { ‘format‘: standard_format }, ‘simple‘: { ‘format‘: simple_format }, }, ‘filters‘: {}, ‘handlers‘: { #打印到終端的日誌 ‘ch‘: { ‘level‘: ‘DEBUG‘, ‘class‘: ‘logging.StreamHandler‘, # 打印到終端 ‘formatter‘: ‘simple‘ }, #打印到a1.log文件的日誌 ‘fh1‘: { ‘level‘: ‘DEBUG‘, ‘class‘: ‘logging.FileHandler‘, # 保存到文件 ‘formatter‘: ‘standard‘, ‘filename‘: fh1_path, # 日誌文件的路徑 ‘encoding‘: ‘utf-8‘, # 日誌文件的編碼,再也不用擔心中文log亂碼了 }, # 打印到a2.log文件的日誌 ‘fh2‘: { ‘level‘: ‘DEBUG‘, ‘class‘: ‘logging.FileHandler‘, # 保存到文件 ‘formatter‘: ‘simple‘, ‘filename‘: fh2_path, # 日誌文件的路徑 ‘encoding‘: ‘utf-8‘, # 日誌文件的編碼,再也不用擔心中文log亂碼了 }, }, ‘loggers‘: { ‘‘: { ‘handlers‘: [‘fh1‘, ‘fh2‘, ‘ch‘], ‘level‘: ‘DEBUG‘, }, }, }
run.py
import logging.config import settings logging.config.dictConfig(settings.LOGGING_DIC) logger1=logging.getLogger(‘用戶交易‘) #logger1-> fh1,fh2,ch logger1.info(‘alex給egon轉賬1個億‘) logger2=logging.getLogger(‘用戶權限‘) #logger2-> fh1,fh2,ch logger2.error(‘egon沒有執行權限‘)
包和日誌模塊的使用