class TNLog(object): def __init__(self, log_dir, context, verbose): if not os.path.exists(log_dir): os.mkdir(log_dir) self.context = context self.log_dir = log_dir self.verbose = verbose self._create_logger() def _create_logger(self): """create logger""" self.loggers = {} handlers = {logging.DEBUG: os.path.join(self.log_dir, ‘DEBUG.log‘), logging.INFO: os.path.join(self.log_dir, ‘INFO.log‘), logging.WARNING: os.path.join(self.log_dir, ‘WARNING.log‘), logging.ERROR: os.path.join(self.log_dir, ‘ERROR.log‘)} levels = handlers.keys() for level in levels: logger = logging.getLogger(str(level)) logger.setLevel(level) formatter = logging.Formatter( ‘%(asctime)s-%(levelname)s:‘ + self.context + ‘:[%(filename)s:%(lineno)3d]:%(message)s‘, datefmt=‘%Y-%m-%d %H:%M:%S‘) file_handler = logging.FileHandler(handlers[level], encoding=‘utf-8‘) file_handler.setLevel(level) file_handler.setFormatter(formatter) logger.handlers = [] logger.addHandler(file_handler) self.loggers[level] = logger def info(self, msg): """ log info level :param msg: log message :return: """ print(self._time+‘-INFO:%s:%s‘ % (self.context, msg), flush=True) self.loggers[logging.INFO].info(msg) def error(self, msg): """ log error level :param msg: log message :return: """ print(self._time+‘-ERROR:%s:%s‘ % (self.context, msg), flush=True) self.loggers[logging.ERROR].error(msg) def debug(self, msg): """ log debug level :param msg: log message :return: """ if self.verbose: print(self._time+‘-DEBUG:%s:%s‘ % (self.context, msg), flush=True) self.loggers[logging.DEBUG].debug(msg) def warning(self, msg): """ log warning level :param msg: log message :return: """ print(self._time + ‘-ERROR:%s:%s‘ % (self.context, msg), flush=True) self.loggers[logging.WARNING].error(msg) @property def _time(self): return time.strftime(‘%Y-%m-%d %H:%M:%S‘, time.localtime())
原文:https://www.cnblogs.com/callyblog/p/10388543.html