標籤:中文 logger main 日期時間 create line ict debug 亂碼
常用模組
1 logging模組
記錄層級:Noset (不設定)
Debug---(調試資訊)----也可用10表示
Info--(訊息資訊)----也可用20表示
Warning---(警告資訊)----也可用30表示
Error------(錯誤訊息)----也可用40表示
Critical---(嚴重錯誤)---也可用50表示
預設層級是Warning,預設列印到終端
1 import logging 2 3 logging.debug(‘調試debug‘) 4 logging.info(‘訊息info‘) 5 logging.warning(‘警告warn‘) 6 logging.error(‘錯誤error‘) 7 logging.critical(‘嚴重critical‘) 8 9 ‘‘‘10 WARNING:root:警告warn11 ERROR:root:錯誤error12 CRITICAL:root:嚴重critical13 ‘‘‘
2,logging模組全域配置,針對所有logger有效
logging模組的四個對象:
Logger:產生日誌的對象Filter:過濾日誌的對象(不常用,可以忽略)Handler:接受日誌然後控制列印到不同的地方, FileHandler用來列印到檔案中,StreamHandler用來列印到終端Formatter對象:可以定製不同的日誌格式對象,然後綁定給不同的Handler對象使用,以此來控制不同的Handler的日誌格式
配置參數:
filename:用指定的檔案名稱建立FiledHandler,這樣日誌會被儲存在檔案中
filemode:檔案開啟檔案,在指定了filename時使用這個參數,預設值為‘a’,還可以指定為‘w’
format:指定handler使用的日誌顯示格式
datafmt:指定日期時間格式
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:使用者輸出的訊息
Logger與Handler的層級
logger是第一級過濾,然後才能到handler,我們可以給logger和handler同時設定level,但是需要主要的是:
無法通過logger層級過濾,日誌就不會列印;
無法通過handler層級過濾,日誌也不會列印
只有同時通過logger層級,和handler層級過濾的日誌才能列印
定義好的logging設定檔(修改相關資訊之後就可以在其他地方使用)
1 """ 2 logging配置 3 """ 4 5 import os 6 import logging.config 7 8 # 定義三種日誌輸出格式 開始 9 10 standard_format = ‘[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]‘ 11 ‘[%(levelname)s][%(message)s]‘ #其中name為getlogger指定的名字12 13 simple_format = ‘[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s‘14 15 id_simple_format = ‘[%(levelname)s][%(asctime)s] %(message)s‘16 17 # 定義日誌輸出格式 結束18 19 logfile_dir = os.path.dirname(os.path.abspath(__file__)) # log檔案的目錄20 21 logfile_name = ‘all2.log‘ # log檔案名稱22 23 # 如果不存在定義的日誌目錄就建立一個24 if not os.path.isdir(logfile_dir):25 os.mkdir(logfile_dir)26 27 # log檔案的全路徑28 logfile_path = os.path.join(logfile_dir, logfile_name)29 30 # log配置字典31 LOGGING_DIC = {32 ‘version‘: 1,33 ‘disable_existing_loggers‘: False,34 ‘formatters‘: {35 ‘standard‘: {36 ‘format‘: standard_format37 },38 ‘simple‘: {39 ‘format‘: simple_format40 },41 },42 ‘filters‘: {},43 ‘handlers‘: {44 #列印到終端的日誌45 ‘console‘: {46 ‘level‘: ‘DEBUG‘,47 ‘class‘: ‘logging.StreamHandler‘, # 列印到螢幕48 ‘formatter‘: ‘simple‘49 },50 #列印到檔案的日誌,收集info及以上的日誌51 ‘default‘: {52 ‘level‘: ‘DEBUG‘,53 ‘class‘: ‘logging.handlers.RotatingFileHandler‘, # 儲存到檔案54 ‘formatter‘: ‘standard‘,55 ‘filename‘: logfile_path, # 記錄檔56 ‘maxBytes‘: 1024*1024*5, # 日誌大小 5M57 ‘backupCount‘: 5,58 ‘encoding‘: ‘utf-8‘, # 記錄檔的編碼,再也不用擔心中文log亂碼了59 },60 },61 ‘loggers‘: {62 #logging.getLogger(__name__)拿到的logger配置63 ‘‘: {64 ‘handlers‘: [‘default‘, ‘console‘], # 這裡把上面定義的兩個handler都加上,即log資料既寫入檔案又列印到螢幕65 ‘level‘: ‘DEBUG‘,66 ‘propagate‘: True, # 向上(更高level的logger)傳遞67 },68 },69 }70 71 72 def load_my_logging_cfg():73 logging.config.dictConfig(LOGGING_DIC) # 匯入上面定義的logging配置74 logger = logging.getLogger(__name__) # 產生一個log執行個體75 logger.info(‘It works!‘) # 記錄該檔案的運行狀態76 77 if __name__ == ‘__main__‘:78 load_my_logging_cfg()79 80 logging設定檔
注意:
logger字典定義一個空key的原因:
1 2 #我們的解決方式是,定義一個空的key 3 ‘loggers‘: { 4 ‘‘: { 5 ‘handlers‘: [‘default‘, ‘console‘], 6 ‘level‘: ‘DEBUG‘, 7 ‘propagate‘: True, 8 }, 9 10 }11 12 這樣我們再取logger對象時13 logging.getLogger(__name__),不同的檔案__name__不同,這保證了列印日誌時標識資訊不同,但是拿著該名字去loggers裡找key名時卻發現找不到,於是預設使用key=‘‘的配置
python之路--day15--常用模組之logging模組