大家肯定都见过日志,在自动化中加入日志信息,有助于问题的定位
下面第一段代码实现基本的日志记录,第二段代码是进行优化过的日志模块
__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()