常用模塊 1 logging模塊 日誌級別:Noset (不設置) Debug (調試信息) 也可用10表示 Info--(消息信息) 也可用20表示 Warning (警告信息) 也可用30表示 Error (錯誤消息) 也可用40表示 Critical (嚴重錯誤) 也可用50表示 預設級別是W ...
常用模塊
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:警告warn 11 ERROR:root:錯誤error 12 CRITICAL:root:嚴重critical 13 '''
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_format 37 }, 38 'simple': { 39 'format': simple_format 40 }, 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, # 日誌大小 5M 57 '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=''的配置