Python logging模块的使用及封装

logging是Python的标准库,不需要我们安装

import logging

logging.info("这是一个普通的信息")
logging.debug("这是一个debug信息")
logging.warning("这是警告信息")
logging.error("出错了,兄弟")
logging.critical("崩溃了")

结果如下:
在这里插入图片描述
可以看到,只有waring以上的等级打印了出来,因为每个日志的等级是不一样的
在这里插入图片描述

如何记录错误

  • 我们一般使用tyr except时错误的日志显示出来
  • 示例如下:
def old_function():
    try:
        1/0
        logging.info("这个没有问题")
    except Exception as e:
        logging.error(e)
    logging.warning("这个方法在下个版本中会被抛弃")
    return "hello"


# 我们一般使用tyr except时错误的日志显示出来

if __name__ == '__main__':
    old_function()

结果如下:
在这里插入图片描述
如果我们在里面添加raise e 的话,程序会在raise的部分停止下来

def old_function():
    try:
        1/0
        logging.info("这个没有问题")
    except Exception as e:
        logging.error(e)
        raise  e  #程序会在raise的部分停下来
    logging.warning("这个方法在下个版本中会被抛弃")
    return "hello"


# 我们一般使用tyr except时错误的日志显示出来

if __name__ == '__main__':
    old_function()

结果如下:
在这里插入图片描述

###日志的组成部分
在这里插入图片描述
在这里插入图片描述

接下来,我们学习日志的各个部分

例子如下:

import logging

# 初始化logger收集器,先写日记本的名字
logger = logging.getLogger("日记本的名字:我的名字")  #其实这部分内容,就是上一部分打印出来的root

# 设置收集器的级别
logger.setLevel('DEBUG')

# 笔的默认级别是warning,默认是使用控制台输出
# console_output = logging.StreamHandler()
# 我们也可以放到file里面

file_output = logging.FileHandler('log.txt')

# 添加handle
logger.addHandler(file_output)

logger.error("出错了,兄弟")
logger.critical("崩溃了")

结果:
在这里插入图片描述
在这里插入图片描述
这里面注意一下级别的问题。
如下代码,收集器的级别是debug,但是笔的级别是warnin,我们看一下结果。

import logging

# 初始化logger收集器,先写日记本的名字
logger = logging.getLogger("日记本的名字:我的名字")  #其实这部分内容,就是上一部分打印出来的root

# 设置收集器的级别
logger.setLevel('DEBUG')  #低于debug类型的收集器是输出不出来的。

# 笔的默认级别是warning,默认是使用控制台输出
# console_output = logging.StreamHandler()
# 我们也可以放到file里面

handle = logging.FileHandler('log.txt')
handle.setLevel("WARNING")

# 添加handle
logger.addHandler(handle)

logger.info("出错了,兄弟")
logger.critical("崩溃了")

结果:
在这里插入图片描述
结果中,就显示了warning以上的等级。
我们就这样记忆,笔记本有一个权限
然后笔输出还是会有一个权限,这个就相当于一个漏斗一样。
但是一般情况下,我们设置成一个级别就可以了

在这里插入图片描述

  • 当然,日志模块你可以自定义多个收集器,但是一般没有必要,你只需要定义一个模块就可以了

最后一部分是函数的封装

  • 这里就直接给封装好的函数了,可以自行研究,其实,直接写成def的函数形式也是可以的
import logging

class LoggerHandler():

    def __init__(self,
                 name = "root",
                 level = 'DEBUG',
                 file = None,
                 format = '%(asctime)s-%(name)s-%(levelname)s-%(message)s-%(lineno)s'
    ):
        logger = logging.getLogger(name)
        #设置级别
        logger.setLevel(level)

        fmt = logging.Formatter(format)
        # 初始化处理器
        if file:
            file_handle = logging.FileHandler(file)
            file_handle.setLevel(level)

            logger.addHandler(file_handle)
            file_handle.setFormatter(fmt)
        stream_handler = logging.StreamHandler()


        # 设置handle 的级别
        stream_handler.setLevel(level)

        logger.addHandler(stream_handler)
        stream_handler.setFormatter(fmt)

        self.logger = logger


    def debug(self,msg):
        return self.logger.debug(msg)

    def error(self,msg):
        return self.logger.error(msg)
    def critical(self,msg):
        return self.logger.critical(msg)
    def info(self,msg):
        return self.logger.info(msg)



if __name__ == '__main__':
    logger = LoggerHandler(file="log1.txt")
    logger.debug("hello world")


  • 第二种封装方法(更推荐)
'''
继承的办法
因为,从封装1的那个py文件中可以看到,下面调用的函数都是继承的别的类,那么我们直接把那个类拿过来使用就可以了

'''

import logging

class LoggerHandler(logging.Logger):

    def __init__(self,
                 name = "root",
                 level = 'DEBUG',
                 file = None,
                 format = '%(asctime)s-%(name)s-%(levelname)s-%(message)s-%(lineno)s'
    ):

        # logger = logging.gerLogger(name)
        super().__init__(name)

        #logger = logging.getLogger(name)
        #设置级别
        self.setLevel(level)

        fmt = logging.Formatter(format)
        # 初始化处理器
        if file:
            file_handle = logging.FileHandler(file)
            file_handle.setLevel(level)

            self.addHandler(file_handle)
            file_handle.setFormatter(fmt)
        stream_handler = logging.StreamHandler()


        # 设置handle 的级别
        stream_handler.setLevel(level)

        self.addHandler(stream_handler)
        stream_handler.setFormatter(fmt)








if __name__ == '__main__':
    logger = LoggerHandler()
    logger.debug("hello world")
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值