import logging
class Log(object):
def __init__(self, name=__name__, path='mylog.log', level='DEBUG'):
self.__name = name
self.__path = path
self.__level = level
self.__logger = logging.getLogger(self.__name)
self.__logger.setLevel(self.__level)
def __ini_handler(self):
"""初始化handler"""
stream_handler = logging.StreamHandler()
file_handler = logging.FileHandler(self.__path, encoding='utf-8')
return stream_handler, file_handler
def __set_handler(self, stream_handler, file_handler, level='DEBUG'):
"""设置handler级别并添加到logger收集器"""
stream_handler.setLevel(level)
file_handler.setLevel(level)
self.__logger.addHandler(stream_handler)
self.__logger.addHandler(file_handler)
def __set_formatter(self, stream_handler, file_handler):
"""设置日志输出格式"""
formatter = logging.Formatter('%(asctime)s-%(name)s-%(filename)s-[line:%(lineno)d]'
'-%(levelname)s-[日志信息]: %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S')
stream_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
def __close_handler(self, stream_handler, file_handler):
"""关闭handler"""
stream_handler.close()
file_handler.close()
@property
def Logger(self):
"""构造收集器,返回looger"""
stream_handler, file_handler = self.__ini_handler()
self.__set_handler(stream_handler, file_handler)
self.__set_formatter(stream_handler, file_handler)
self.__close_handler(stream_handler, file_handler)
return self.__logger
if __name__ == '__main__':
log = Log(__name__, 'file.log')
logger = log.Logger
logger.debug('I am a debug message')
logger.info('I am a info message')
logger.warning('I am a warning message')
logger.error('I am a error message')
logger.critical('I am a critical message')
方法二
# -*- coding:utf-8 -*- # @Time # @Author: WangBenYan import logging import os import time path = os.path.dirname(os.path.realpath(__file__)) # 获取本地路径 log_path = os.path.join(path, 'logs') # log_path是存放日志的路径 # 如果不存在这个logs文件夹,就自动创建一个 if not os.path.exists(log_path): os.mkdir(log_path) class Log: def __init__(self): # 文件的命名 self.logname = os.path.join(log_path, './%s.log' % time.strftime('%Y_%m_%d')) self.logger = logging.getLogger('Airtest') self.logger.setLevel(logging.INFO) # 日志输出格式 self.formatter = logging.Formatter(f'%(asctime)s -| %(name)s -| {log_path}| %(levelname)s -| %(message)s') def __console(self, level, message): # 创建一个fileHander,用于写入本地 fh = logging.FileHandler(self.logname, 'a', encoding='utf-8') # fh = RotatingFileHandler(self.logname, maxBytes=1 * 1024, backupCount=3) fh.setLevel(logging.DEBUG) fh.setFormatter(self.formatter) self.logger.addHandler(fh) # 创建一个StreamHandler,用于输入到控制台 ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(self.formatter) self.logger.addHandler(ch) if level == 'info': self.logger.info(message) elif level == 'debug': self.logger.debug(message) elif level == 'warning': self.logger.warning(message) elif level == 'error': self.logger.error(message) # 避免日志重复 self.logger.removeHandler(fh) self.logger.removeHandler(ch) # 关闭打开文件 fh.close() def debug(self, message): self.__console('debug', message) def info(self, message): self.__console('info', message) def warning(self, message): self.__console('warning', message) def error(self, message): self.__console('error', message) if __name__ == '__main__': log = Log() log.info('测试') log.debug('测试') log.warning('测试') log.error('测试')