python之路--day15--常用模組之logging模組

來源:互聯網
上載者:User

標籤:中文   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模組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.