标签:字符 定义函数 logging 返回 调用函数 utils logger 数字 封装
日志封装
1、封装日志函数(主要)
1)封装:将代码装在一个盒子里面,盒子的形式有函数、类。即将代码逻辑封装成函数或者类,然后再调用函数和类
2)日志函数的封装:
a、def get_logger(name,logger_level,stream_handler_level,fmt_str,file,file_handler_level)返回值为Logger(收集器)
name:收集器的名称,logger_level:收集器日志等级,stream_handler_level:流处理器等级,fmt_str:日志格式化字符串,file:日志输出文件,在函数里面需要判断是否存在file,存在file的情况下才能获取文件处理器,file_hanler_level
b、因为需要传入的参数比较多,调用的时候还是很麻烦,所以定义函数的时候参数都给默认值,这样调用的时候即使不传入参数也能用
def get_logger(name="root",
logger_level="DEBUG",
stream_handler_level="DEBUG",
fmt_str="%(asctime)s:%(levelname)s:%(name)s:%(message)s----%(filename)s----%(lineno)d",
file=None,
file_handler_level="INFO")
因为在控制台需要输出debug的日志,需要调试,而文件中无需输出debug的日志,故设置日志等级为info
c、日志格式必须需要添加:
1)%(levelname)s:日志等级名称
2)%(name)s:收集器的名称
3)%(message)s:日志内容信息
4)%(asctime)s:日志输出时间, 默认形式为 ‘2003-07-08 16:49:45,896‘ (逗号之后的数字为时间的毫秒部分)。
5)%(filename)s:日志打印的py文件名称( pathname
的文件名部分)。
6)%(lineno)d:发出日志记录调用所在的源行号。
2、类封装
使用继承logging.Logger来封装
class Logger(logging.Logger): # 因为继承了logging.Logger,所以当创建Logger的时候自己本身就是收集器了
def __init__(self,
name="root",
logger_level="DEBUG",
stream_handler_level="DEBUG",
fmt_str="%(asctime)s:%(levelname)s:%(name)s:%(message)s----%(filename)s----%(lineno)d",
file=None,
file_handler_level="INFO"):
super().__init__(name,logger_level) # 调用父类__init__,相当于logging.getLogger(name)+Logger.setLevel(logger_level) ,
# 因为继承了logging.Logger类,它本身就是收集器了,只需要传入name和logger_level进行初始化设置
# 设置日志格式
fmt = logging.Formatter(fmt_str)
# 获取处理器并设置日志等级以及日志格式,并添加到收集器
handler = logging.StreamHandler()
handler.setLevel(stream_handler_level)
handler.setFormatter(fmt)
# 添加处理器到收集器
self.addHandler(handler )
# 获取文件处理器并设置日志等级以及日志格式
if file:
file_handler = logging.FileHandler(file, encoding="utf-8")
file_handler.setLevel(file_handler_level)
file_handler.setFormatter(fmt)
self.addHandler(file_handler)
标签:字符 定义函数 logging 返回 调用函数 utils logger 数字 封装
原文地址:https://www.cnblogs.com/lynne-wu/p/14234297.html