python 获取行号,函数名等信息

用于写日志

# -*- 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)


转载于:https://my.oschina.net/1123581321/blog/262708

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值