【Python日志封装类基本实现】

前言

日志功能,作为软件开发必不可少。Python的日志封装网上也有不少,不乏抄来抄去。抄,可以。但必须验证才能转发。如果仅仅是复制粘贴,就没意思了,甚至误导别人。以下是2天内自己研究验证的新的,与大家共享。
实现的思路是基于logging包。
需求:

  • 支持屏幕打印和文件输出
  • 支持日期、时间、引用源文件名(不要求全路径)、行号,日志信息
    说明:这里是最基础的要求。更高要求实现,在后续文章介绍。

实现过程

直接上代码

class Logger(object):
    '''
    日志封装类
    使用方法:
        from logger import log

        log.info('hello world!')
    '''

    def __init__(self, log_file_path, level=logging.INFO):
        '''
            log_file_path 日志文件,全路径带日志文件名
            level 日志级别:DEBUG INFO WARNING ERROR CRITICAL
        '''
        self.curlogger = logging.getLogger()
        self.curlogger.setLevel(level)
        # set log output format
        formatter = logging.Formatter('%(asctime)s [%(levelname)s] [%(filename)s: %(lineno)d]  %(message)s', '%Y-%m-%d %H:%M:%S')

        # file log output setting
        file_handler = logging.FileHandler(log_file_path)
        file_handler.setFormatter(formatter)
        file_handler.setLevel(level)
        self.curlogger.addHandler(file_handler)

        # console log output setting
        console = logging.StreamHandler()
        console.setLevel(level)
        console.setFormatter(formatter)
        self.curlogger.addHandler(console)

log = Logger("infer.log", logging.DEBUG).curlogger

输出测试结果:

2022-01-20 09:51:57 [INFO] [test.py: 16]  info log
2022-01-20 09:51:57 [INFO] [test.py: 6]  info log in function test()
2022-01-20 09:51:57 [DEBUG] [test.py: 7]  debug log in function test()
2022-01-20 09:51:57 [WARNING] [test.py: 8]  waring log in function test()
2022-01-20 09:51:57 [INFO] [test.py: 11]  log in function of rename()
2022-01-20 09:51:57 [ERROR] [test.py: 12]  runtime error: bad parameter

注意事项

网络上有的人在该封装类添加了封装函数,如下:

def debug(self, message):
        """
        :param message: debug信息
        :return:
        """
        self.logger.debug(message)

    def info(self, message):
        """
        :param message: info信息
        :return:
        """
        self.logger.info(message)

    def warn(self, message):
        """
        :param warn: warn 信息
        :return:
        """
        self.logger.warn(message)

    def error(self, message):
        """
        :param message: error 信息
        :return:
        """
        self.logger.error(message)

这样做的后果很明显:封装的4个函数,掩盖了logging本来的接口函数,将日志调用源文件固化为logger.py,如下:

2022-01-20 09:34:50 [inference] [INFO] [logger.py: 16 ]  info log
2022-01-20 09:34:50 [inference] [INFO] [logger.py: 6 ]  info log in function test()
2022-01-20 09:34:50 [inference] [DEBUG] [logger.py: 7 ]  debug log in function test()
2022-01-20 09:34:50 [inference] [WARNING] [logger.py:8 ]  waring log in function test()
2022-01-20 09:34:50 [inference] [INFO] [logger.py: 11 ]  log in function of rename()
2022-01-20 09:34:50 [inference] [ERROR] [logger.py: 12 ]  runtime error: bad parameter

这样行号和源文件对应不起来。所以文章不要盲目的抄,你验证下,才是抄会了,对吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值