Python的日志记录-logging模块的使用
一、日志
1.1什么是日志
日志是跟蹤軟件運(yùn)行時(shí)所發(fā)生的事件的一種方法,軟件開發(fā)者在代碼中調(diào)用日志函數(shù),表明發(fā)生了特定的事件,事件由描述性消息描述,同時(shí)還包含事件的重要性,重要性也稱為級(jí)別或嚴(yán)重性。
1.2何時(shí)使用日志
logging模塊提供了一些函數(shù),用來(lái)做一些簡(jiǎn)單的日志,他們是debug()、info()、warning()、error()、critical()。要決定什么時(shí)候使用logging,見下表,描述了常見的任務(wù)及對(duì)應(yīng)的最佳工具。
| 在控制臺(tái)上顯示命令行腳本或者程序的常規(guī)用法說(shuō)明 | print() |
| 報(bào)告在程序的正常操作期間發(fā)生的事件(例如,用于狀態(tài)監(jiān)視或故障調(diào)查) | logging.info()?(或者?logging.debug()?,非常詳細(xì)的輸出,用于診斷目的) |
| 對(duì)于特定的運(yùn)行時(shí)事件發(fā)出警告 | 在庫(kù)代碼中使用warnings.warn()?,表明問題是可以避免的,且客戶應(yīng)用應(yīng)該修改代碼以消除警告 使用logging.warning()?表示客戶應(yīng)用對(duì)此問題無(wú)能為力,但是還是應(yīng)該注意該事件。 |
| 對(duì)于特定的運(yùn)行時(shí)事件報(bào)告錯(cuò)誤 | 拋出異常 |
| 報(bào)告錯(cuò)誤的抑制而不引發(fā)異常(例如,在長(zhǎng)時(shí)間運(yùn)行的服務(wù)器進(jìn)程中的錯(cuò)誤處理程序) | 根據(jù)特定的錯(cuò)誤和應(yīng)用領(lǐng)域,使用合適的logging.error()、?logging.exception()?或者logging.critical() |
?
1.3事件嚴(yán)重性(事件的級(jí)別)
?
| DEBUG | 詳細(xì)信息,一般只在調(diào)試問題時(shí)使用。 |
| INFO | 證明事情按預(yù)期工作。 |
| WARNING | 某些沒有預(yù)料到的事件的提示,或者在將來(lái)可能會(huì)出現(xiàn)的問題提示。例如:磁盤空間不足。但是軟件還是會(huì)照常運(yùn)行。 |
| ERROR | 由于更嚴(yán)重的問題,軟件已不能執(zhí)行一些功能了。 |
| CRITICAL | 嚴(yán)重錯(cuò)誤,表明軟件已不能繼續(xù)運(yùn)行了。 |
默認(rèn)等級(jí)時(shí)warning。意味著只有warning以上的事件等級(jí)才會(huì)反饋信息,可以通過(guò)logging.setLevel()修改默認(rèn)等級(jí)。
二、Logging簡(jiǎn)介
logging模塊定義的類和函數(shù)位應(yīng)用程序和庫(kù)實(shí)現(xiàn)了一個(gè)靈活的事件日志系統(tǒng)。由標(biāo)準(zhǔn)庫(kù)提供的日志記錄API的好處是所有的Python模塊都可以使用日志。
2.1使用logging記錄到控制臺(tái)
#1.使用logging 將日志打印到控制臺(tái) logging.basicConfig(level=logging.DEBUG) #默認(rèn)level時(shí)warning。所以需要修改一下級(jí)別 logging.debug('debug') logging.info('info') logging.warning('warning') logging.error('error') logging.critical('critical')2.2使用logging將日志記錄到文件
#2.將日志記錄到文件 logging.basicConfig(filename='logging.log',filemode='a',level=logging.DEBUG) #默認(rèn)level時(shí)warning。所以需要修改一下級(jí)別 logging.debug('debug') logging.info('info') logging.warning('warning') logging.error('error') logging.critical('critical')2.3 如果程序由多個(gè)模塊,組織日志
# myapp.py import logging import mylibdef main():logging.basicConfig(filename='myapp.log', level=logging.INFO)logging.info('Started') mylib.do_something() logging.info('Finished') if __name__ == '__main__':main()三、改變顯示消息格式Formatter
logger對(duì)象一般不會(huì)直接實(shí)例化得到,而是通過(guò)模塊級(jí)別的logging.getLogger()得到。以相同的名字多次調(diào)用getLogger()。永遠(yuǎn)返回相同的logger對(duì)象的引用-->單例模式。
3.1 format 指定輸出格式和內(nèi)容
?
import logging logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG) logging.debug('debug msg') logging.info('info msg') logging.warning('warning msg') logging.error('error msg') logging.critical('critical msg')常用的format格式:
%(levelno)s: 打印日志級(jí)別的數(shù)值%(levelname)s: 打印日志級(jí)別名稱%(pathname)s: 打印當(dāng)前執(zhí)行程序的路徑,其實(shí)就是sys.argv[0]%(filename)s: 打印當(dāng)前執(zhí)行程序名%(funcName)s: 打印日志的當(dāng)前函數(shù)%(lineno)d: 打印日志的當(dāng)前行號(hào)%(asctime)s: 打印日志的時(shí)間%(thread)d: 打印線程ID%(threadName)s: 打印線程名稱%(process)d: 打印進(jìn)程ID%(message)s: 打印日志信息 format import os #format logging.basicConfig(level=logging.DEBUG,format='%(asctime)s:%(filename)s [line:%(lineno)d] %(levelname)s %(message)s',datefmt='%a, %d %b %Y %H:%M:%S',filename= os.path.join('format.txt'),filemode='w',) logging.debug('debug msg') logging.error('error msg')四、Logger
Logger對(duì)象有三個(gè)作用,首先,它暴露給應(yīng)用幾個(gè)方法以便應(yīng)用可以在運(yùn)行時(shí)寫log;其次,Logger對(duì)象按照l(shuí)og信息的嚴(yán)重程度或者根據(jù)filter對(duì)象來(lái)決定如何處理log信息(默認(rèn)的過(guò)濾功能);最后,logger還負(fù)責(zé)把log信息傳送給相關(guān)的loghandlers。
4.1將日志記錄控制臺(tái)及文件
import logginglogger = logging.getLogger() # 創(chuàng)建一個(gè)handler,用于寫入日志文件 fh = logging.FileHandler('test.log',encoding='utf-8') # 再創(chuàng)建一個(gè)handler,用于輸出到控制臺(tái) ch = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setLevel(logging.DEBUG)fh.setFormatter(formatter) ch.setFormatter(formatter) logger.addHandler(fh) #logger對(duì)象可以添加多個(gè)fh和ch對(duì)象 logger.addHandler(ch) logger.debug('logger debug message') logger.info('logger info message') logger.warning('logger warning message') logger.error('logger error message') logger.critical('logger critical message')?
logging庫(kù)提供了多個(gè)組件:Logger、Handler、Filter、Formatter。Logger對(duì)象提供應(yīng)用程序可直接使用的接口,Handler發(fā)送日志到適當(dāng)?shù)哪康牡?#xff0c;Filter提供了過(guò)濾日志信息的方法,Formatter指定日志顯示格式。另外,可以通過(guò):logger.setLevel(logging.Debug)設(shè)置級(jí)別,當(dāng)然,也可以通過(guò)
fh.setLevel(logging.Debug)單對(duì)文件流設(shè)置某個(gè)級(jí)別。
轉(zhuǎn)載于:https://www.cnblogs.com/weihengblog/p/8568283.html
總結(jié)
以上是生活随笔為你收集整理的Python的日志记录-logging模块的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android edittext 不滚动
- 下一篇: python实现批量压缩文件夹