用于写日志
# -*- coding: utf-8 -*-
"""日志处理
为了兼容现有的print日志, 也采用print,而不是logging,
增加日志级别 error > warn > info > debug
增加日期,行号,函数名,文件名
"""
import sys, os, time
log_level = 0
DEBUG = 0
INFO = 1
WARN = 2
ERROR = 3
NONE = 4
FG_DATETIME = False
FG_LINENO = True
FG_FILENAME = True
FG_FUNCNAME = True
def set_level(level):
"""设置日志级别
log.set_level(log.DEBUG)
"""
global log_level
log_level = level
def 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 = funcnane
def _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)