詳解Python中的日志模塊logging
許多應(yīng)用程序中都會(huì)有日志模塊,用于記錄系統(tǒng)在運(yùn)行過程中的一些關(guān)鍵信息,以便于對(duì)系統(tǒng)的運(yùn)行狀況進(jìn)行跟蹤。在.NET平臺(tái)中,有非常著名的第三方開源日志組件log4net,c++中,有人們熟悉的log4cpp,而在python中,我們不需要第三方的日志組件,因?yàn)樗呀?jīng)為我們提供了簡單易用、且功能強(qiáng)大的日志模塊:logging。logging模塊支持將日志信息保存到不同的目標(biāo)域中,如:保存到日志文件中;以郵件的形式發(fā)送日志信息;以http get或post的方式提交日志到web服務(wù)器;以windows事件的形式記錄等等。這些日志保存方式可以組合使用,每種方式可以設(shè)置自己的日志級(jí)別以及日志格式。日志模塊的內(nèi)容比較多,今天先學(xué)習(xí)logging模塊的基本使用,下次具體學(xué)習(xí)日志的處理。
先看一個(gè)比較簡單的例子,讓我們對(duì)logging模塊有個(gè)感性的認(rèn)識(shí):
 
import logging
logging.basicConfig(filename = os.path.join(os.getcwd(), 'log.txt'), level = logging.DEBUG)
logging.debug('this is a message')
運(yùn)行上面例子的代碼,將會(huì)在程序的根目錄下創(chuàng)建一個(gè)log.txt文件,打開該文件,里面有一條日志記錄:”DEBUG:root:this is a message”。
4個(gè)主要的組件
- logger: 日志類,應(yīng)用程序往往通過調(diào)用它提供的api來記錄日志;
 - handler: 對(duì)日志信息處理,可以將日志發(fā)送(保存)到不同的目標(biāo)域中;
 - filter: 對(duì)日志信息進(jìn)行過濾;
 - formatter:日志的格式化;
 
日志級(jí)別
在記錄日志時(shí), 日志消息都會(huì)關(guān)聯(lián)一個(gè)級(jí)別(“級(jí)別”本質(zhì)上是一個(gè)非負(fù)整數(shù))。系統(tǒng)默認(rèn)提供了6個(gè)級(jí)別,它們分別是:

可以給日志對(duì)象(Logger Instance)設(shè)置日志級(jí)別,低于該級(jí)別的日志消息將會(huì)被忽略,也可以給Hanlder設(shè)置日志級(jí)別,對(duì)于低于該級(jí)別的日志消息, Handler也會(huì)忽略。
logging模塊中的常用函數(shù):
logging.basicConfig([**kwargs]):
為日志模塊配置基本信息。kwargs 支持如下幾個(gè)關(guān)鍵字參數(shù):
- filename :日志文件的保存路徑。如果配置了些參數(shù),將自動(dòng)創(chuàng)建一個(gè)FileHandler作為Handler;
 - filemode :日志文件的打開模式。 默認(rèn)值為'a',表示日志消息以追加的形式添加到日志文件中。如果設(shè)為'w', 那么每次程序啟動(dòng)的時(shí)候都會(huì)創(chuàng)建一個(gè)新的日志文件;
 - format :設(shè)置日志輸出格式;
 - datefmt :定義日期格式;
 - level :設(shè)置日志的級(jí)別.對(duì)低于該級(jí)別的日志消息將被忽略;
 - stream :設(shè)置特定的流用于初始化StreamHandler;
 
下面是一個(gè)簡單的例子:
 
#coding=gbk
import logging
logging.basicConfig(filename = os.path.join(os.getcwd(), 'log.txt'), /
  level = logging.WARN, filemode = 'w', format = '%(asctime)s - %(levelname)s: %(message)s')
logging.debug('debug') 
#被忽略
logging.info('info')  
#被忽略
logging.warning('warn')
logging.error('error')
#----- 結(jié)果
#2009-07-13 21:42:15,592 - WARNING: warn
#2009-07-13 21:42:15,640 - ERROR: error
logging.getLogger([name])
創(chuàng)建Logger對(duì)象。日志記錄的工作主要由Logger對(duì)象來完成。在調(diào)用getLogger時(shí)要提供Logger的名稱(注:多次使用相同名稱來調(diào)用getLogger,返回的是同一個(gè)對(duì)象的引用。),Logger實(shí)例之間有層次關(guān)系,這些關(guān)系通過Logger名稱來體現(xiàn),如:
p = logging.getLogger(“root”) c1 = logging.getLogger(“root.c1″) c2 = logging.getLogger(“root.c2″)
例子中,p是父logger, c1,c2分別是p的子logger。c1, c2將繼承p的設(shè)置。如果省略了name參數(shù), getLogger將返回日志對(duì)象層次關(guān)系中的根Logger。
logging.setLoggerClass(klass)
logging.getLoggerClass()
獲取/設(shè)置日志類型。用戶可以自定義日志類來代替系統(tǒng)提供的logging.Logger類。
logging.getLevelName(lvl)
獲取日志級(jí)別對(duì)應(yīng)的名稱。例如:
 
print logging.getLevelName(logging.NOTSET) print logging.getLevelName(10) #logging.DEBUG print logging.getLevelName(logging.DEBUG) print logging.getLevelName(30) #logging.WARN print logging.getLevelName(logging.ERROR) print logging.getLevelName(50) #logging.CRITICAL logging.shutdown()
當(dāng)不再使用日志系統(tǒng)的時(shí)候,調(diào)用該方法,它會(huì)將日志flush到對(duì)應(yīng)的目標(biāo)域上。一般在系統(tǒng)退出的時(shí)候調(diào)用。
Logger對(duì)象 通過調(diào)用logging.getLogger(name)來創(chuàng)建,它有如下常用的方法和屬性:
Logger.setLevel(lvl):
設(shè)置日志的級(jí)別。對(duì)于低于該級(jí)別的日志消息將被忽略。下面一個(gè)例子演示setLevel方法:
 
#coding=gbk
import logging
logging.basicConfig(filename = os.path.join(os.getcwd(), 'log.txt'), level = logging.DEBUG)
log = logging.getLogger('root.test')
log.setLevel(logging.WARN) #日志記錄級(jí)別為WARNNING
log.info('info')  #不會(huì)被記錄
log.debug('debug') #不會(huì)被記錄
log.warning('warnning')
log.error('error')
Logger.debug(msg [ ,*args [, **kwargs]])
記錄DEBUG級(jí)別的日志信息。參數(shù)msg是信息的格式,args與kwargs分別是格式參數(shù)。
 
import logging
logging.basicConfig(filename = os.path.join(os.getcwd(), 'log.txt'), level = logging.DEBUG)
log = logging.getLogger('root')
log.debug('%s, %s, %s', *('error', 'debug', 'info'))
log.debug('%(module)s, %(info)s', {'module': 'log', 'info': 'error'})
Logger.info(msg[ , *args[ , **kwargs] ] )
Logger.warnning(msg[ , *args[ , **kwargs] ] )
Logger.error(msg[ , *args[ , **kwargs] ] )
Logger.critical(msg[ , *args[ , **kwargs] ] )
記錄相應(yīng)級(jí)別的日志信息。參數(shù)的含義與Logger.debug一樣。
Logger.log(lvl, msg[ , *args[ , **kwargs] ] )
記錄日志,參數(shù)lvl用戶設(shè)置日志信息的級(jí)別。參數(shù)msg, *args, **kwargs的含義與Logger.debug一樣。
Logger.exception(msg[, *args])
以ERROR級(jí)別記錄日志消息,異常跟蹤信息將被自動(dòng)添加到日志消息里。Logger.exception通過用在異常處理塊中,如:
 
import logging
logging.basicConfig(filename = os.path.join(os.getcwd(), 'log.txt'), level = logging.DEBUG)
log = logging.getLogger('root')
try:
  raise Exception, 'this is a exception'
except:
  log.exception('exception') 
#異常信息被自動(dòng)添加到日志消息中
Logger.addFilter(filt)Logger.removeFilter(filt)
添加/移除日志消息過濾器。在講述Filter時(shí)具體介紹。
Logger.addHandler(hdlr)
Logger.removeHandler(hdlr)
添加/移除日志消息處理器。在講述Handler時(shí)具體介紹。
Logger.makeRecord(name, lvl, fn, lno, msg, args, exc_info[, func, extra])
創(chuàng)建LogRecord對(duì)象。日志消息被實(shí)例為一個(gè)LogRecord對(duì)象,并在日志類內(nèi)處理。
相關(guān)文章
 python各類經(jīng)緯度轉(zhuǎn)換的實(shí)例代碼
這篇文章主要介紹了python各類經(jīng)緯度轉(zhuǎn)換的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
 mac PyCharm添加Python解釋器及添加package路徑的方法
今天小編就為大家分享一篇mac PyCharm添加Python解釋器及添加package路徑的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10
 Python實(shí)現(xiàn)各種排序算法的代碼示例總結(jié)
這篇文章主要介紹了Python實(shí)現(xiàn)各種排序算法的代碼示例總結(jié),其實(shí)Python是非常好的算法入門學(xué)習(xí)時(shí)的配套高級(jí)語言,需要的朋友可以參考下2015-12-12
 python matplotlib中文顯示參數(shù)設(shè)置解析
這篇文章主要介紹了python matplotlib中文顯示參數(shù)設(shè)置解析,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
 解決python2中unicode()函數(shù)在python3中報(bào)錯(cuò)的問題
這篇文章主要介紹了在python2中unicode()函數(shù)在python3中報(bào)錯(cuò)的解決方案,希望給大家做個(gè)參考,下次出現(xiàn)這個(gè)問題的時(shí)候,也知道如何應(yīng)對(duì)2021-05-05
 PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
這篇文章主要介紹了PyQt5.6+pycharm配置以及pyinstaller生成exe,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06

