国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

使用python的logging模塊

2019-11-14 17:35:00
字體:
供稿:網(wǎng)友

一、從一個使用場景開始

 

開發(fā)一個日志系統(tǒng), 既要把日志輸出到控制臺, 還要寫入日志文件

 

Python代碼  收藏代碼
  1. import logging  
  2.   
  3. # 創(chuàng)建一個logger  
  4. logger = logging.getLogger('mylogger')  
  5. logger.setLevel(logging.DEBUG)  
  6.   
  7. # 創(chuàng)建一個handler,用于寫入日志文件  
  8. fh = logging.FileHandler('test.log')  
  9. fh.setLevel(logging.DEBUG)  
  10.   
  11. # 再創(chuàng)建一個handler,用于輸出到控制臺  
  12. ch = logging.StreamHandler()  
  13. ch.setLevel(logging.DEBUG)  
  14.   
  15. # 定義handler的輸出格式  
  16. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  
  17. fh.setFormatter(formatter)  
  18. ch.setFormatter(formatter)  
  19.   
  20. # 給logger添加handler  
  21. logger.addHandler(fh)  
  22. logger.addHandler(ch)  
  23.   
  24. # 記錄一條日志  
  25. logger.info('foorbar')  

 

 

運行后, 在控制臺和日志文件都有一條日志:

 

java代碼  收藏代碼
  1. 2011-08-31 19:18:29,816 - mylogger - INFO - foorbar  

 

 

二、logging模塊的API

 

結(jié)合上面的例子,我們說下幾個最常使用的API

logging.getLogger([name])返回一個logger實例,如果沒有指定name,返回root logger。只要name相同,返回的logger實例都是同一個而且只有一個,即name和logger實例是一一對應(yīng)的。這意味著,無需把logger實例在各個模塊中傳遞。只要知道name,就能得到同一個logger實例
Logger.setLevel(lvl)設(shè)置logger的level, level有以下幾個級別:

NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
如果把looger的級別設(shè)置為INFO, 那么小于INFO級別的日志都不輸出, 大于等于INFO級別的日志都輸出

Python代碼  收藏代碼
  1. logger.debug("foobar")    # 不輸出   
  2. logger.info("foobar")        # 輸出  
  3. logger.warning("foobar") # 輸出  
  4. logger.error("foobar")      # 輸出  
  5. logger.critical("foobar")    # 輸出  

 Logger.addHandler(hdlr)logger可以雇傭handler來幫它處理日志, handler主要有以下幾種:StreamHandler: 輸出到控制臺FileHandler:   輸出到文件handler還可以設(shè)置自己的level以及輸出格式。
logging.basicConfig([**kwargs])* 這個函數(shù)用來配置root logger, 為root logger創(chuàng)建一個StreamHandler,   設(shè)置默認的格式。* 這些函數(shù): logging.debug()、logging.info()、logging.warning()、   logging.error()、logging.critical() 如果調(diào)用的時候發(fā)現(xiàn)root logger沒有任何   handler, 會自動調(diào)用basicConfig添加一個handler* 如果root logger已有handler, 這個函數(shù)不做任何事情
使用basicConfig來配置root logger的輸出格式和level:

Python代碼  收藏代碼
  1. import logging  
  2. logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)  
  3. logging.debug('This message should appear on the console')  

 
三、關(guān)于root logger以及l(fā)ogger的父子關(guān)系
前面多次提到root logger, 實際上logger實例之間還有父子關(guān)系, root logger就是處于最頂層的logger, 它是所有l(wèi)ogger的祖先。如下圖:root logger是默認的logger如果不創(chuàng)建logger實例, 直接調(diào)用logging.debug()、logging.info()logging.warning()、logging.error()、logging.critical()這些函數(shù),那么使用的logger就是 root logger, 它可以自動創(chuàng)建,也是單實例的。
如何得到root logger通過logging.getLogger()或者logging.getLogger("")得到root logger實例。
默認的levelroot logger默認的level是logging.WARNING
如何表示父子關(guān)系logger的name的命名方式可以表示logger之間的父子關(guān)系. 比如:parent_logger = logging.getLogger('foo')child_logger = logging.getLogger('foo.bar')
什么是effective levellogger有一個概念,叫effective level。 如果一個logger沒有顯示地設(shè)置level,那么它就用父親的level。如果父親也沒有顯示地設(shè)置level, 就用父親的父親的level,以此推....最后到達root logger,一定設(shè)置過level。默認為logging.WARNINGchild loggers得到消息后,既把消息分發(fā)給它的handler處理,也會傳遞給所有祖先logger處理,
來看一個例子

Python代碼  收藏代碼
  1. import logging  
  2.   
  3. # 設(shè)置root logger  
  4. r = logging.getLogger()  
  5. ch = logging.StreamHandler()  
  6. ch.setLevel(logging.DEBUG)  
  7. formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')  
  8. ch.setFormatter(formatter)  
  9. r.addHandler(ch)  
  10.   
  11. # 創(chuàng)建一個logger作為父親  
  12. p = logging.getLogger('foo')  
  13. p.setLevel(logging.DEBUG)  
  14. ch = logging.StreamHandler()  
  15. ch.setLevel(logging.DEBUG)  
  16. formatter = logging.Formatter('%(asctime)s - %(message)s')  
  17. ch.setFormatter(formatter)  
  18. p.addHandler(ch)  
  19.   
  20. # 創(chuàng)建一個孩子logger  
  21. c = logging.getLogger('foo.bar')  
  22. c.debug('foo')  

 輸出如下:

Python代碼  收藏代碼
  1. 2011-08-31 21:04:29,893 - foo  
  2. 2011-08-31 21:04:29,893 - DEBUG - foo  


可見, 孩子logger沒有任何handler,所以對消息不做處理。但是它把消息轉(zhuǎn)發(fā)給了它的父親以及root logger。最后輸出兩條日志。


上一篇:Djangotemplate

下一篇:python操作CouchDB

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 瑞安市| 兖州市| 安丘市| 邯郸县| 广河县| 阿尔山市| 九江县| 武穴市| 临邑县| 天镇县| 永定县| 南通市| 滁州市| 缙云县| 都江堰市| 绥江县| 思南县| 新田县| 安达市| 新宾| 龙山县| 吉林省| 德阳市| 临城县| 文昌市| 凌海市| 石门县| 溧阳市| 浦城县| 玉树县| 金塔县| 永平县| 安达市| 昌江| 合水县| 福安市| 岗巴县| 耿马| 肥城市| 长兴县| 大新县|