用于写日志
# -*- coding: utf-8 -*-"""日志处理为了兼容现有的print日志, 也采用print,而不是logging,增加日志级别 error > warn > info > debug 增加日期,行号,函数名,文件名"""import sys, os, timelog_level = 0DEBUG = 0INFO = 1WARN = 2ERROR = 3NONE = 4FG_DATETIME = FalseFG_LINENO = TrueFG_FILENAME = TrueFG_FUNCNAME = Truedef set_level(level): """设置日志级别 log.set_level(log.DEBUG) """ global log_level log_level = leveldef set_opt(datetime=True, lineno=True, filename=True, funcnane=True): """设置显示参数""" global FG_DATETIME, FG_LINENO, FG_FILENAME, FG_FUNCNAME FG_DATETIME = datetime FG_LINENO = lineno FG_FILENAME = filename FG_FUNCNAME = funcnanedef _dolog(*args, **kw): def tostr(arg): if isinstance(arg, list): arg = "[" + ",".join(map(str, arg)) + "]" elif isinstance(arg, tuple): arg = "(" + ",".join(map(str, arg)) + ")" elif isinstance(arg, set): arg = "{" + ",".join(map(str, arg)) + "}" elif isinstance(arg, dict): arg = "{" + ",".join(["%s:%s" % (str(k), str(v)) for k,v in arg.iteritems()]) + "}" else: arg = str(arg) return arg reparg = " ".join(map(tostr, args)) repkw = "" if kw: repkw = " | " + " ".join(["%s=%s" % (str(k), str(v)) for k,v in kw.iteritems()]) repstr = reparg + repkw return repstr def debug(*args, **kw): if log_level > DEBUG: return prefix = "[D]" # traceback info try: raise Exception except: f_tb = sys.exc_info()[2].tb_frame.f_back t = time.strftime("%Y-%m-%d %X") if FG_DATETIME else "" name = os.path.basename(f_tb.f_code.co_filename) if FG_FILENAME else "" funcname = f_tb.f_code.co_name if FG_FUNCNAME else "" line = str(f_tb.f_lineno) if FG_LINENO else "" # int tbstr = "[" + ",".join(filter(lambda x:str(x) != "", (t, name, funcname, line))) + "]" print prefix + tbstr + _dolog(*args, **kw)def info(*args, **kw): if log_level > INFO: return prefix = "[I]" # traceback info try: raise Exception except: f_tb = sys.exc_info()[2].tb_frame.f_back t = time.strftime("%Y-%m-%d %X") if FG_DATETIME else "" name = os.path.basename(f_tb.f_code.co_filename) if FG_FILENAME else "" funcname = f_tb.f_code.co_name if FG_FUNCNAME else "" line = str(f_tb.f_lineno) if FG_LINENO else "" # int tbstr = "[" + ",".join(filter(lambda x:str(x) != "", (t, name, funcname, line))) + "]" print prefix + tbstr + _dolog(*args, **kw) def warn(*args, **kw): if log_level > WARN: return prefix = "[W]" # traceback info try: raise Exception except: f_tb = sys.exc_info()[2].tb_frame.f_back t = time.strftime("%Y-%m-%d %X") if FG_DATETIME else "" name = os.path.basename(f_tb.f_code.co_filename) if FG_FILENAME else "" funcname = f_tb.f_code.co_name if FG_FUNCNAME else "" line = str(f_tb.f_lineno) if FG_LINENO else "" # int tbstr = "[" + ",".join(filter(lambda x:str(x) != "", (t, name, funcname, line))) + "]" print prefix + tbstr + _dolog(*args, **kw) def error(*args, **kw): if log_level > ERROR: return prefix = "[E]" # traceback info try: raise Exception except: f_tb = sys.exc_info()[2].tb_frame.f_back t = time.strftime("%Y-%m-%d %X") if FG_DATETIME else "" name = os.path.basename(f_tb.f_code.co_filename) if FG_FILENAME else "" funcname = f_tb.f_code.co_name if FG_FUNCNAME else "" line = str(f_tb.f_lineno) if FG_LINENO else "" # int tbstr = "[" + ",".join(filter(lambda x:str(x) != "", (t, name, funcname, line))) + "]" print prefix + tbstr + _dolog(*args, **kw)