def logprint(logname, category, level='INFO', backupCount=15): """ Print logs by datetime. logname string, file name category string, category path of logs file in log directory level string, restrict whether logs to be printed or not backupCount int, how many backups can be reserved """ path = os.path.join(CFG.dir, category.strip('/'), logname.strip('/') + '.log') print "log path:", path if not os.path.exists(path[:path.rindex('/')]): os.makedirs(path[:path.rindex('/')]) # Initialize logger logger = logging.getLogger(logname) frt = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') hdr = logging.StreamHandler(sys.stdout) hdr.setFormatter(frt) hdr._name = '##_sh_##' if not hdr._name in CFG.exist: logger.addHandler(hdr) CFG.exist.append(hdr._name) hdr = TimedRotatingFileHandler(path, 'D', 1, backupCount) hdr.setFormatter(frt) hdr._name = '##_rfh_##' if not hdr._name in CFG.exist: logger.addHandler(hdr) CFG.exist.append(hdr._name) if level.upper() == 'NOTEST': level == logging.NOTSET elif level.upper() == 'DEBUG': level == logging.DEBUG elif level.upper() == 'WARNING': level == logging.WARNING elif level.upper() == 'ERROR': level == logging.ERROR elif level.upper() == 'CRITICAL': level == logging.CRITICAL else: level == logging.INFO logger.setLevel(level) def _wraper(*args, **kwargs): if not CFG.debug: return if not args: return for hdr in CFG.handlers: if not hdr._name in CFG.exist: logger.addHandler(hdr) CFG.exist.append(hdr._name) encoding = 'utf8' if os.name == 'posix' else 'gbk' args = [_cu(a, encoding) for a in args] prefix = '' pl = kwargs.get('printlevel', 'info').upper() if pl == 'DEBUG': try: logger.debug('', *args, **kwargs) except: t, v, b = sys.exc_info() err_messages = traceback.format_exception(t, v, b) print 'Error: %s' % ','.join(err_messages) elif pl == 'WARNING': try: logger.warning('', *args, **kwargs) except: t, v, b = sys.exc_info() err_messages = traceback.format_exception(t, v, b) print 'Error: %s' % ','.join(err_messages) elif pl == 'ERROR': try: logger.error('', *args, **kwargs) except: t, v, b = sys.exc_info() err_messages = traceback.format_exception(t, v, b) print 'Error: %s' % ','.join(err_messages) elif pl == 'CRITICAL': try: logger.critical('', *args, **kwargs) except: t, v, b = sys.exc_info() err_messages = traceback.format_exception(t, v, b) print 'Error: %s' % ','.join(err_messages) else: try: logger.info('', *args, **kwargs) except: t, v, b = sys.exc_info() err_messages = traceback.format_exception(t, v, b) print 'Error: %s' % ','.join(err_messages) return _wraper, logger
def logprint(logname, category, level='INFO', maxBytes=1024*10124*100, backupCount=15, to_stdout=True, sentrykey=''): """ 生成日志输出的方法和对象 @param logname 日志名称 @param category 日志路径 @param level 日志输出级别 (可选) @param maxBytes 日志单次输出最大长度 (可选) @param backupCount 日志轮询备份记录 (可选) @param to_stdout 是否屏幕输出 (可选) @param sentrykey 输送到sentry的配置 (可选) @return _wraper 返回日志方法 @return logger 返回日志对象 """ path = os.path.join(LOGDIR, category, logname + '.log') print "log path:", path if not os.path.exists(path[:path.rindex('/')]): os.makedirs(path[:path.rindex('/')]) # Initialize logger logger = logging.getLogger(logname) # frt = logging.Formatter('%(message)s') frt = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') hdr = None if path: # hdr = RotatingFileHandler(path, 'a', maxBytes, backupCount, 'utf-8') hdr = TimedRotatingFileHandler(path, 'D', 1, backupCount) hdr.suffix = "%Y%m%d" hdr.setFormatter(frt) hdr._name = logname + '_p' already_in = False for _hdr in logger.handlers: if _hdr._name == logname + '_p': already_in = True break if not already_in: logger.addHandler(hdr) if to_stdout: hdr = logging.StreamHandler(sys.stdout) hdr.setFormatter(frt) hdr._name = logname + '_s' already_in = False for _hdr in logger.handlers: if _hdr._name == logname + '_s': already_in = True if not already_in: logger.addHandler(hdr) if level == 'NOTEST': level == logging.NOTSET elif level == 'DEBUG': level == logging.DEBUG elif level == 'WARNING': level == logging.WARNING elif level == 'ERROR': level == logging.ERROR elif level == 'CRITICAL': level == logging.CRITICAL else: level == logging.INFO logger.setLevel(level) sentrykey = sentrykey.strip() print 'see sentry: ', sentrykey # hdr = SentryHandler('http://*****:*****@111.innapp.cn:9090/3') if not sentrykey == '': if not '?' in sentrykey: sentrykey = sentrykey + '?timeout=' + str(TIMEOUT) elif not 'timeout=' in sentrykey.split('?')[-1]: sentrykey = sentrykey + '&timeout=' + str(TIMEOUT) hdr = SentryHandler(sentrykey) # setup_logging(hdr) # logger.addHandler(hdr) def _wraper(*args, **kwargs): if not LOGDEBUG: return if not args: return encoding = 'utf8' if os.name == 'posix' else 'gbk' args = [_cu(a, encoding) for a in args] f_back = None try: raise Exception except: f_back = sys.exc_traceback.tb_frame.f_back f_name = f_back.f_code.co_name filename = os.path.basename(f_back.f_code.co_filename) m_name = os.path.splitext(filename)[0] prefix = (u'[%s.%s]' % (m_name, f_name)).ljust(20, ' ') s = kwargs.get('to_sentry', False) if s and not sentrykey == '': logger.addHandler(hdr) else: logger.removeHandler(hdr) l = kwargs.get('printlevel', 'info').upper() if l == 'DEBUG': try: logger.debug(u' '.join([prefix, ' '.join(args)])) except: t, v, b = sys.exc_info() err_messages = traceback.format_exception(t, v, b) print 'Error: %s' % ','.join(err_messages) elif l == 'WARNING': try: logger.warning(u' '.join([prefix, ' '.join(args)])) except: t, v, b = sys.exc_info() err_messages = traceback.format_exception(t, v, b) print 'Error: %s' % ','.join(err_messages) elif l == 'ERROR': try: logger.error(u' '.join([prefix, ' '.join(args)])) except: t, v, b = sys.exc_info() err_messages = traceback.format_exception(t, v, b) print 'Error: %s' % ','.join(err_messages) elif l == 'CRITICAL': try: logger.critical(u' '.join([prefix, ' '.join(args)])) except: t, v, b = sys.exc_info() err_messages = traceback.format_exception(t, v, b) print 'Error: %s' % ','.join(err_messages) else: try: logger.info(u' '.join([prefix, ' '.join(args)])) except: t, v, b = sys.exc_info() err_messages = traceback.format_exception(t, v, b) print 'Error: %s' % ','.join(err_messages) return _wraper, logger