python日志库封装

文章讲述了作者对Python内置logging库的改进,提出了一种更易用的封装,模仿print函数风格,无需严格参数匹配和类型检查,便于阅读和问题追踪。作者还展示了如何利用inspect模块获取调用者信息。
摘要由CSDN通过智能技术生成

python中的logging库不是很好用,大概需要这样用:

logging.info("index %d is %s and %s, failed, reason: %s", index, str1, str2, reason);

我怕我把握不住,占位符必须和参数一一对应,不一致或者类型不一致都可能是抛出异常,这样写还会割裂阅读感,占位符形式的日志就是**。

什么样的比较好呢,比如个人习惯这样:

log.info("index:", index, "is", str1, "and", str2, "failed, reason:", reason);

好在哪里呢?不用管参数匹配,不用管参数类型,顺序打印,随时添加修改。

下面就基于python的logging库,封装一个简单符合上述风格的即插即用的log库,贴上完整的代码:


import logging
import os
import inspect

# 日志模块,和print函数风格一致,比占位符模式的logging好用
"""
使用方式举例:
import mylog
a = 100
str = "hello"
mylog.info("a:", a, "str:", str)

output:
YYYY-MM-DD hh:mm:ss INFO [filename:lineno func_name] a: 100 str: hello

"""

# 初始化logging,并输出到控制台
logging.basicConfig(
    level=logging.INFO,
    filename="log.log",
    format='%(asctime)s %(levelname)s %(message)s',
    filemode='a',
    datefmt='%Y-%m-%d %H:%M:%S')
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter(
    '%(asctime)s %(levelname)s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)

def getContent(*args, filename, lineno, func):
    content = "[" + os.path.split(filename)[-1] + ":" + str(lineno) + " " + func + "]"
    for arg in args:
        content += " "
        content += str(arg)
    return content

def info(*args):
    lastStackFrame = inspect.currentframe().f_back # 拿到上一个栈帧
    logging.info(getContent(*args, filename=lastStackFrame.f_code.co_filename, lineno=lastStackFrame.f_lineno, func=lastStackFrame.f_code.co_name))
    
def warn(*args):
    lastStackFrame = inspect.currentframe().f_back
    logging.warn(getContent(*args, filename=lastStackFrame.f_code.co_filename, lineno=lastStackFrame.f_lineno, func=lastStackFrame.f_code.co_name))
    
def error(*args):
    lastStackFrame = inspect.currentframe().f_back
    logging.error(getContent(*args, filename=lastStackFrame.f_code.co_filename, lineno=lastStackFrame.f_lineno, func=lastStackFrame.f_code.co_name))

其中inspect主要是为了拿到调用者的文件名、方法名、代码所在行等信息,方便排查问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值