1. 程式人生 > >利用python實現記錄日誌,附程式碼和優化

利用python實現記錄日誌,附程式碼和優化

大家肯定都見過日誌,在自動化中加入日誌資訊,有助於問題的定位

下面第一段程式碼實現基本的日誌記錄,第二段程式碼是進行優化過的日誌模組

 

__author__ = 'zz'
import logging
#定義一個屬於自己的日誌收集器
from common import  project_path

class MyLog:
def my_log(self,level,msg): my_logger=logging.getLogger("xxxx") my_logger.setLevel("DEBUG")#設定 #
創造一個專屬輸出渠道 過濾 和排版 #格式: formatter = logging.Formatter('%(asctime)s-%(levelname)s-%(filename)s-%(name)s-日誌資訊:%(message)s') ch=logging.StreamHandler()#輸出到控制檯 ch.setLevel("DEBUG")#設定輸出級別 大寫 ch.setFormatter(formatter) fh=logging.FileHandler(project_path.logs_path,encoding='
UTF-8')#輸出到制定檔案 fh.setLevel("DEBUG")#設定輸出級別 大寫 fh.setFormatter(formatter) #對接起來 給日誌收集器新增一個渠道 my_logger.addHandler(ch) my_logger.addHandler(fh) if level=='DEBUG': my_logger.debug(msg) elif level=='INFO': my_logger.info(msg)
elif level=='WARNING': my_logger.warning(msg) elif level=='ERROR': my_logger.error(msg) elif level=='CRITICAL': my_logger.critical(msg) # #渠道要記得移除掉 否則 日誌輸出會重複 my_logger.removeHandler(ch) my_logger.removeHandler(fh) def debug(self,msg): self.my_log("DEBGU",msg) def info(self, msg): self.my_log("INFO",msg) def warning(self,msg): self.my_log("ERROR",msg) def error(self,msg): self.my_log("WARNING",msg) def critical(self,msg): self.my_log("CRITICAL",msg) if __name__ == '__main__': my_logger=MyLog() my_logger.debug(xxx) my_logger.info(xxx) my_logger.warning(xxx) my_logger.error(xxx) my_logger.critical(xxx)

 

可優化部分:

日誌級別及輸出檔案寫在配置檔案中,可通過修改配置檔案中的引數達到修改日誌模組引數的效果

 

class Logger(object):
def __init__(self, logger_name='NGTP'): self.logger = logging.getLogger(logger_name)#定義日誌收集器 logging.root.setLevel(logging.NOTSET) if Config().get('LOG_FILENAME'): # 日誌檔名稱/讀取config.json檔案中的LOG_FILENAME值 self.log_file_name = Config().get('LOG_FILENAME') else: self.log_file_name = 'test.log' if Config().get('LOG_BACKUP'): # /讀取config.json檔案中的LOG_BACKUP值 self.backup_count = Config().get('LOG_BACKUP') else: self.backup_count = 5 if Config().get('LOG_CONSOLE_LEVEL'): # 讀取config.json檔案中的LOG_CONSOLE_LEVEL值,控制檯輸出日誌級別 self.console_output_level = Config().get('LOG_CONSOLE_LEVEL') else: self.console_output_level = 'INFO' if Config().get('LOG_FILE_LEVEL'): # 讀取config.json檔案中的LOG_FILE_LEVEL值,檔案輸出日誌級別 self.file_output_level = Config().get('LOG_FILE_LEVEL') else: self.file_output_level = 'DEBUG' if Config().get('LOG_PARTTERN'): # 讀取config.json檔案中的LOG_PARTTERN值,輸出日誌格式 self.formatter = logging.Formatter(Config().get('LOG_PARTTERN')) else: self.formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') def get_logger(self): if not self.logger.handlers: console_handler = logging.StreamHandler()#定義日誌輸出到控制檯 console_handler.setFormatter(self.formatter)#控制檯輸出格式 console_handler.setLevel(self.console_output_level)#控制檯輸出級別 self.logger.addHandler(console_handler)#收集器和日誌輸出控制檯加連線 file_handler = TimedRotatingFileHandler(filename=os.path.join(LOG_PATH, self.log_file_name), when='D', interval=1, backupCount=self.backup_count, delay=True, encoding='utf-8') file_handler.setFormatter(self.formatter) file_handler.setLevel(self.file_output_level) self.logger.addHandler(file_handler) #收集器和日誌輸出到檔案加連線 return self.logger logger = Logger().get_logger()