python常用模組介紹之三:logging模組
簡介:
Python的logging模組提供了通用的日誌系統,可以方便第三方模組或者是應用使用。這個模組提供不同的日誌級別,並可以採用不同的方式記錄日誌,比如檔案,HTTP GET/POST,SMTP,Socket等,甚至可以自己實現具體的日誌記錄方式。
模組提供logger,handler,filter,formatter。
1.logger:提供日誌介面,供應用程式碼使用。logger最長用的操作有兩類:配置和傳送日誌訊息。可以通過logging.getLogger(name)獲取logger物件,如果不指定name則返回root物件,多次使用相同的name呼叫getLogger方法返回同一個logger
2.handler:將日誌記錄(logrecord)傳送到合適的目的地(destination),比如檔案,socket等。一個logger物件可以通過addHandler方法新增0到多個handler,每個handler又可以定義不同日誌級別,以實現日誌分級過濾顯示。
3. filter:提供一種優雅的方式決定一個日誌記錄是否傳送到handler。
4. formatter:指定日誌記錄輸出的具體格式。formatter的構造方法需要兩個引數:訊息的格式字串和日期字串,這兩個引數都是可選的。
備註:
一般在大型的專案中,由於有多個檔案需要輸出log,所以需要重寫logging
具體如下例:
重寫了logger類
#!/usr/lib/python
# -*- coding: utf-8 -*-
import
logging
import
os
#
自定義日誌級別level_none =logging.NOTSET
level_debug = logging.DEBUG
level_info = logging.INFO
level_warn = logging.WARN
level_error = logging.ERROR
level_critical = logging.CRITICAL
def __init__(self, s_name_log,s_path_log= "E:/work", i_level_log=logging.DEBUG):
# 自定義一個名為s_name_log的logger
self.customLogger = logging.getLogger(s_name_log)
# 例項化一個format,定義了log的格式fmt = logging.Formatter('%(asctime)s %(levelname)s %(message)s','%Y-%m-%d %H:%M:%S')
# 例項化一個filehander,log可以將message寫入檔案中fh =logging.FileHandler(os.path.join(s_path_log, s_name_log))
# 例項化一個streamhandler,log可以將message輸出到控制檯中sh = logging.StreamHandler()
# 例項化一個filter,對logger的name進行過濾,如果s_name_log=='JeremyLogging',輸出;反之,過濾掉
# 這個filter可以配置到handler中,也可以直接配置到logger中ft = logging.Filter('JeremyLogging')
fh.setFormatter(fmt)
fh.setLevel(i_level_log)
# fh.addFilter(ft)
sh.setFormatter(fmt)
sh.setLevel(i_level_log)
sh.addFilter(ft)
self.customLogger.addHandler(fh)
self.customLogger.addHandler(sh)
self.customLogger.addFilter(ft)
def debug(self, s_message_log):
self.customLogger.debug(s_message_log)
def info(self, s_message_log):
self.customLogger.info(s_message_log)
def warning(self, s_message_log):
self.customLogger.warning(s_message_log)
def error(self, s_message_log):
self.customLogger.error(s_message_log)
def critical(self, s_message_log):
self.customLogger.critical(s_message_log)
測試自定義的logger類
#!/usr/lib/python # -*- coding: utf-8 -*- import python_logging import sys class JeremyLogging(object): def __init__(self): self.logger = python_logging.CustomLogger(self.__class__.__name__, i_level_log=python_logging.level_info) def testFunc1(self): self.logger.info('[%s.%s]: jeremy test info' % (self.__class__.__name__, sys._getframe().f_code.co_name)) self.logger.debug('[%s.%s]: jeremy test debug' % (self.__class__.__name__, sys._getframe().f_code.co_name)) self.logger.error('[%s.%s]: jeremy test error' % (self.__class__.__name__, sys._getframe().f_code.co_name)) log = JeremyLogging() log.testFunc1()
輸出結果:
控制檯中顯示:
2016-09-27 16:37:21 ERROR[JeremyLogging.testFunc1]: jeremy test error
文字中顯示: cat E:/work/ JeremyLogging
2016-09-27 16:37:21 ERROR [JeremyLogging.testFunc1]: jeremytest error