python常用模塊介紹之三:logging模塊



簡介:

       Pythonlogging模塊提供了通用的日誌系統,可以方便第三方模塊或者是應用使用。這個模塊提供不同的日誌級別,並可以採用不同的方式記錄日誌,比如文件,HTTP GET/POSTSMTPSocket等,甚至可以自己實現具體的日誌記錄方式。

模塊提供loggerhandlerfilterformatter

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模塊,達到自定義文件輸出格式,輸出路徑等一系列統一的要求,能省去多次重複定義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

class CustomLogger(object):
   
def __init__(self, s_name_log,s_path_log= "E:/work", i_level_log=logging.DEBUG):
       
# 自定義一個名爲s_name_loglogger
       
self.customLogger = logging.getLogger(s_name_log)

       
# 實例化一個format,定義了log的格式
       
fmt = logging.Formatter('%(asctime)s %(levelname)s %(message)s','%Y-%m-%d %H:%M:%S')
       
# 實例化一個filehanderlog可以將message寫入文件中
       
fh =logging.FileHandler(os.path.join(s_path_log, s_name_log))
       
# 實例化一個streamhandlerlog可以將message輸出到控制檯中
       
sh = logging.StreamHandler()
       
# 實例化一個filter,對loggername進行過濾,如果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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章