[python標準庫]Logging模塊
阿新 • • 發佈:2017-06-12
post 日誌信息 tin 方式 asc dha event 如果 bytes
1.模塊簡介
logging模塊是Python內置的標準模塊,主要用於輸出運行日誌,可以設置輸出日誌的等級、日誌保存路徑、日誌文件回滾等;相比print,具備如下優點:
- 可以通過設置不同的日誌等級,在release版本中只輸出重要信息,而不必顯示大量的調試信息;
- print將所有信息都輸出到標準輸出中,嚴重影響開發者從標準輸出中查看其它數據;logging則可以由開發者決定將信息輸出到什麽地方,以及怎麽輸出;
模塊提供logger,handler,filter,formatter。
- logger:提供日誌接口,供應用代碼使用。logger最長用的操作有兩類:配置和發送日誌消息。可以通過logging.getLogger(name)獲取logger對象,如果不指定name則返回root對象,多次使用相同的name調用getLogger方法返回同一個logger對象。
- handler:將日誌記錄(log record)發送到合適的目的地(destination),比如文件,socket等。一個logger對象可以通過addHandler方法添加0到多個handler,每個handler又可以定義不同日誌級別,以實現日誌分級過濾顯示。
- filter:提供一種優雅的方式決定一個日誌記錄是否發送到handler。
- formatter:指定日誌記錄輸出的具體格式。formatter的構造方法需要兩個參數:消息的格式字符串和日期字符串,這兩個參數都是可選的。
2.模塊的使用
a.簡單的將日誌打印到屏幕
import logging logging.debug(‘This is debug message‘) logging.info(‘This is info message‘) logging.warning(‘This is warning message‘) #輸出結果: WARNING:root:This is warning message
默認情況下,logging將日誌打印到屏幕,日誌級別為WARNING;
日誌級別大小關系為:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,當然也可以自己定義日誌級別。
b.通過logging.basicConfig函數對日誌的輸出格式及方式做相關配置
import logging 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=‘LOG.log‘, filemode=‘w‘) logging.debug(‘This is debug message‘) logging.info(‘This is info message‘) logging.warning(‘This is warning message‘)
#輸出到LOG.log
Mon, 12 Jun 2017 18:31:10 log.py[line:14] DEBUG This is debug messagelogging.basicConfig函數各參數:
Mon, 12 Jun 2017 18:31:10 log.py[line:15] INFO This is info message
Mon, 12 Jun 2017 18:31:10 log.py[line:16] WARNING This is warning message
c.將日誌同時輸出到文件和屏幕
import logging 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=‘myapp.log‘, filemode=‘w‘) ################################################################################################# #定義一個StreamHandler,將INFO級別或更高的日誌信息打印到標準錯誤,並將其添加到當前的日誌處理對象# console = logging.StreamHandler() console.setLevel(logging.INFO) formatter = logging.Formatter(‘%(name)-12s: %(levelname)-8s %(message)s‘) console.setFormatter(formatter) logging.getLogger(‘‘).addHandler(console) ################################################################################################# logging.debug(‘This is debug message‘) logging.info(‘This is info message‘) logging.warning(‘This is warning message‘)View Code
d.logging之日誌回滾
import logging from logging.handlers import RotatingFileHandler #定義一個RotatingFileHandler,最多備份5個日誌文件,每個日誌文件最大10M Rthandler = RotatingFileHandler(‘myapp.log‘, maxBytes=10*1024*1024,backupCount=5) Rthandler.setLevel(logging.INFO) formatter = logging.Formatter(‘%(name)-12s: %(levelname)-8s %(message)s‘) Rthandler.setFormatter(formatter) logging.getLogger(‘‘).addHandler(Rthandler)
logging有一個日誌處理的主對象,其它處理方式都是通過addHandler添加進去的。logging的幾種handle方式如下:
logging.StreamHandler: 日誌輸出到流,可以是sys.stderr、sys.stdout或者文件 logging.FileHandler: 日誌輸出到文件 日誌回滾方式,實際使用時用RotatingFileHandler和TimedRotatingFileHandler logging.handlers.BaseRotatingHandler logging.handlers.RotatingFileHandler logging.handlers.TimedRotatingFileHandler logging.handlers.SocketHandler: 遠程輸出日誌到TCP/IP sockets logging.handlers.DatagramHandler: 遠程輸出日誌到UDP sockets logging.handlers.SMTPHandler: 遠程輸出日誌到郵件地址 logging.handlers.SysLogHandler: 日誌輸出到syslog logging.handlers.NTEventLogHandler: 遠程輸出日誌到Windows NT/2000/XP的事件日誌 logging.handlers.MemoryHandler: 日誌輸出到內存中的制定buffer logging.handlers.HTTPHandler: 通過"GET"或"POST"遠程輸出到HTTP服務器View Code
由於StreamHandler和FileHandler是常用的日誌處理方式,所以直接包含在logging模塊中,而其他方式則包含在logging.handlers模塊中.
e.單文件日誌
import logging logging.basicConfig(filename=‘log.log‘, format=‘%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s‘, datefmt=‘%Y-%m-%d %H:%M:%S %p‘, level=10) logging.debug(‘debug‘) logging.info(‘info‘) logging.warning(‘warning‘) logging.error(‘error‘) logging.critical(‘critical‘) logging.log(10,‘log‘)
CRITICAL = 50 FATAL = CRITICAL ERROR = 40 WARNING = 30 WARN = WARNING INFO = 20 DEBUG = 10 NOTSET = 0日誌等級
註:只有【當前寫等級】大於【日誌等級】時,日誌文件才被記錄。
f.多文件日誌
# 定義文件 file_1_1 = logging.FileHandler(‘l1_1.log‘, ‘a‘, encoding=‘utf-8‘) fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s") file_1_1.setFormatter(fmt) file_1_2 = logging.FileHandler(‘l1_2.log‘, ‘a‘, encoding=‘utf-8‘) fmt = logging.Formatter() file_1_2.setFormatter(fmt) # 定義日誌 logger1 = logging.Logger(‘s1‘, level=logging.ERROR) logger1.addHandler(file_1_1) logger1.addHandler(file_1_2) # 寫日誌 logger1.critical(‘1111‘)日誌一
# 定義文件 file_2_1 = logging.FileHandler(‘l2_1.log‘, ‘a‘) fmt = logging.Formatter() file_2_1.setFormatter(fmt) # 定義日誌 logger2 = logging.Logger(‘s2‘, level=logging.INFO) logger2.addHandler(file_2_1)日誌二
如上述創建的兩個日誌對象
- 當使用【logger1】寫日誌時,會將相應的內容寫入 l1_1.log 和 l1_2.log 文件中
- 當使用【logger2】寫日誌時,會將相應的內容寫入 l2_1.log 文件中
3.日誌小實例
#在CMD窗口上只打出error以上級別的日誌,但是在日誌中打出debug以上的信息 import logging logger = logging.getLogger("simple_example") logger.setLevel(logging.DEBUG) # 建立一個filehandler來把日誌記錄在文件裏,級別為debug以上 fh = logging.FileHandler("spam.log") fh.setLevel(logging.DEBUG) # 建立一個streamhandler來把日誌打在CMD窗口上,級別為error以上 ch = logging.StreamHandler() ch.setLevel(logging.ERROR) # 設置日誌格式 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") ch.setFormatter(formatter) fh.setFormatter(formatter) #將相應的handler添加在logger對象中 logger.addHandler(ch) logger.addHandler(fh) # 開始打日誌 logger.debug("debug message") logger.info("info message") logger.warn("warn message") logger.error("error message") logger.critical("critical message")View Code
參考資料:
每個 Python 程序員都要知道的日誌實踐
[python標準庫]Logging模塊