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")