一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python中使用logging模塊打印log日志詳解

Python中使用logging模塊打印log日志詳解

2020-05-30 10:30腳本之家 Python

這篇文章主要介紹了Python中使用logging模塊打印log日志詳解,本文講解了logging模塊介紹、基本使用方法、高級使用方法、使用實例等,需要的朋友可以參考下

學(xué)一門新技術(shù)或者新語言,我們都要首先學(xué)會如何去適應(yīng)這們新技術(shù),其中在適應(yīng)過程中,我們必須得學(xué)習(xí)如何調(diào)試程序并打出相應(yīng)的log信息來,正所謂“只要log打的好,沒有bug解不了”,在我們熟知的一些信息技術(shù)中,log4xxx系列以及開發(fā)Android app時的android.util.Log包等等都是為了開發(fā)者更好的得到log信息服務(wù)的。在Python這門語言中,我們同樣可以根據(jù)自己的程序需要打出log。

log信息不同于使用打樁法打印一定的標(biāo)記信息,log可以根據(jù)程序需要而分出不同的log級別,比如info、debug、warn等等級別的信息,只要實時控制log級別開關(guān)就可以為開發(fā)人員提供更好的log信息,與log4xx類似,logger,handler和日志消息的調(diào)用可以有具體的日志級別(Level),只有在日志消息的級別大于logger和handler的設(shè)定的級別,才會顯示。下面我就來談?wù)勎以赑ython中使用的logging模塊一些方法。

logging模塊介紹

Python的logging模塊提供了通用的日志系統(tǒng),熟練使用logging模塊可以方便開發(fā)者開發(fā)第三方模塊或者是自己的Python應(yīng)用。同樣這個模塊提供不同的日志級別,并可以采用不同的方式記錄日志,比如文件,HTTP、GET/POST,SMTP,Socket等,甚至可以自己實現(xiàn)具體的日志記錄方式。下文我將主要介紹如何使用文件方式記錄log。

logging模塊包括logger,handler,filter,formatter這四個基本概念。

logger:提供日志接口,供應(yīng)用代碼使用。logger最長用的操作有兩類:配置和發(fā)送日志消息。可以通過logging.getLogger(name)獲取logger對象,如果不指定name則返回root對象,多次使用相同的name調(diào)用getLogger方法返回同一個logger對象。
handler:將日志記錄(log record)發(fā)送到合適的目的地(destination),比如文件,socket等。一個logger對象可以通過addHandler方法添加0到多個handler,每個handler又可以定義不同日志級別,以實現(xiàn)日志分級過濾顯示。
filter:提供一種優(yōu)雅的方式?jīng)Q定一個日志記錄是否發(fā)送到handler。
formatter:指定日志記錄輸出的具體格式。formatter的構(gòu)造方法需要兩個參數(shù):消息的格式字符串和日期字符串,這兩個參數(shù)都是可選的。

基本使用方法

一些小型的程序我們不需要構(gòu)造太復(fù)雜的log系統(tǒng),可以直接使用logging模塊的basicConfig函數(shù)即可,代碼如下:

復(fù)制代碼 代碼如下:

'''
Created on 2012-8-12
 
@author: walfred
@module: loggingmodule.BasicLogger
'''
import logging
 
log_file = "./basic_logger.log"
 
logging.basicConfig(filename = log_file, level = logging.DEBUG)
 
logging.debug("this is a debugmsg!")
logging.info("this is a infomsg!")
logging.warn("this is a warn msg!")
logging.error("this is a error msg!")
logging.critical("this is a critical msg!")

 

運(yùn)行程序時我們就會在該文件的當(dāng)前目錄下發(fā)現(xiàn)basic_logger.log文件,查看basic_logger.log內(nèi)容如下:

 

復(fù)制代碼 代碼如下:

INFO:root:this is a info msg!
DEBUG:root:this is a debug msg!
WARNING:root:this is a warn msg!
ERROR:root:this is a error msg!
CRITICAL:root:this is a critical msg!

 

需要說明的是我將level設(shè)定為DEBUG級別,所以log日志中只顯示了包含該級別及該級別以上的log信息。信息級別依次是:notset、debug、info、warn、error、critical。如果在多個模塊中使用這個配置的話,只需在主模塊中配置即可,其他模塊會有相同的使用效果。

較高級版本

上述的基礎(chǔ)使用比較簡單,沒有顯示出logging模塊的厲害,適合小程序用,現(xiàn)在我介紹一個較高級版本的代碼,我們需要依次設(shè)置logger、handler、formatter等配置。

 

復(fù)制代碼 代碼如下:

'''
Created on 2012-8-12
 
@author: walfred
@module: loggingmodule.NomalLogger
'''
import logging
 
log_file = "./nomal_logger.log"
log_level = logging.DEBUG
 
logger = logging.getLogger("loggingmodule.NomalLogger")
handler = logging.FileHandler(log_file)
formatter = logging.Formatter("[%(levelname)s][%(funcName)s][%(asctime)s]%(message)s")
 
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(log_level)
 
#test
logger.debug("this is a debug msg!")
logger.info("this is a info msg!")
logger.warn("this is a warn msg!")
logger.error("this is a error msg!")
logger.critical("this is a critical msg!")

 

這時我們查看當(dāng)前目錄的nomal_logger.log日志文件,如下:

 

復(fù)制代碼 代碼如下:

[DEBUG][][2012-08-12 17:43:59,295]this is a debug msg!
[INFO][][2012-08-12 17:43:59,295]this is a info msg!
[WARNING][][2012-08-12 17:43:59,295]this is a warn msg!
[ERROR][][2012-08-12 17:43:59,295]this is a error msg!
[CRITICAL][][2012-08-12 17:43:59,295]this is a critical msg!

 

這個對照前面介紹的logging模塊,不難理解,下面的最終版本將會更加完整。

完善版本

這個最終版本我用singleton設(shè)計模式來寫一個Logger類,代碼如下:

復(fù)制代碼 代碼如下:

'''
Created on 2012-8-12
 
@author: walfred
@module: loggingmodule.FinalLogger
'''
 
import logging.handlers
 
class FinalLogger:
 
 logger = None
 
 levels = {"n" : logging.NOTSET,
  "d" : logging.DEBUG,
  "i" : logging.INFO,
  "w" : logging.WARN,
  "e" : logging.ERROR,
  "c" : logging.CRITICAL}
 
 log_level = "d"
 log_file = "final_logger.log"
 log_max_byte = 10 * 1024 * 1024;
 log_backup_count = 5
 
 @staticmethod
 def getLogger():
  if FinalLogger.logger is not None:
   return FinalLogger.logger
 
  FinalLogger.logger = logging.Logger("oggingmodule.FinalLogger")
  log_handler = logging.handlers.RotatingFileHandler(filename = FinalLogger.log_file,\
  maxBytes = FinalLogger.log_max_byte,\
  backupCount = FinalLogger.log_backup_count)
  log_fmt = logging.Formatter("[%(levelname)s][%(funcName)s][%(asctime)s]%(message)s")
  log_handler.setFormatter(log_fmt)
  FinalLogger.logger.addHandler(log_handler)
  FinalLogger.logger.setLevel(FinalLogger.levels.get(FinalLogger.log_level))
  return FinalLogger.logger
 
if __name__ == "__main__":
 logger = FinalLogger.getLogger()
 logger.debug("this is a debug msg!")
 logger.info("this is a info msg!")
 logger.warn("this is a warn msg!")
 logger.error("this is a error msg!")
 logger.critical("this is a critical msg!")

 

當(dāng)前目錄下的 final_logger.log內(nèi)容如下:

復(fù)制代碼 代碼如下:

[DEBUG][][2012-08-12 18:12:23,029]this is a debug msg!
[INFO][][2012-08-12 18:12:23,029]this is a info msg!
[WARNING][][2012-08-12 18:12:23,029]this is a warn msg!
[ERROR][][2012-08-12 18:12:23,029]this is a error msg!
[CRITICAL][][2012-08-12 18:12:23,029]this is a critical msg!


這個final版本,也是我一直用的,讀者朋友也可以再加上其他的一些Handler,比如StreamHandler等等來獲取更多的log信息,當(dāng)然也可以將你的log信息通過配置文件來完成。

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 桃色导航 | 好大夫在线个人空间 | 日韩视频一区 | 欧美日韩高清观看一区二区 | 九九热精品免费观看 | 国色天香社区视频免费观看3 | 95视频在线观看在线分类h片 | 青春草视频免费观看 | 出差上的少妇20p | 草草视频在线观看最新 | 久久88综合 | 国产在线视频福利 | 牛牛色婷婷在线视频播放 | 成人aqq| 完整秽淫刺激长篇小说 | 97精品国产自在现线免费 | 久久精品视频在线看 | 无人在线观看免费高清视频播放 | 美女一级ba大片免色 | 紧致肉肉高h | 欧美一级艳片视频免费观看 | 国产精品免费aⅴ片在线观看 | 美女撒尿部位无遮挡 | 国产免费福利片 | 婷婷色伊人| 亚洲欧美激情日韩在线 | 91在线亚洲精品一区 | 欧洲兽皇 | 大桥未久aⅴ一区二区 | 乌克兰少妇大胆大BBW | 欧美日韩国产一区二区三区在线观看 | 国产精品国产三级在线专区 | 国产精品99久久免费观看 | 国产综合社区 | 女子张腿让男人桶免费 | 无人影院在线播放视频 | 无码AV免费精品一区二区三区 | 精品一成人岛国片在线观看 | 亚洲精品国产精品国自产观看 | 国产欧美另类久久精品91 | 啊好爽视频|