python3 logging日志封装实例
一个完整的程序离不开日志,无论是开发阶段,还是测试阶段,亦或程序运行阶段,都可以通过日志查看程序的运行情况,或是定位问题。
下面是对python3的日志库logging进行了封装,对于大部分的需求应该是能满足的。(如果有不满足的地方,欢迎在下方留言)
程序结构:
|--logger.py | |--singleton.py | |--demo.py | |--log || |2018-10-12.log
logger.py
importos importsys importtime importlogging fromsingletonimportSingleton @Singleton#如需打印不同路径的日志(运行日志、审计日志),则不能使用单例模式(注释或删除此行)。此外,还需设定参数name。 classLogger: def__init__(self,set_level="INFO", name=os.path.split(os.path.splitext(sys.argv[0])[0])[-1], log_name=time.strftime("%Y-%m-%d.log",time.localtime()), log_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),"log"), use_console=True): """ :paramset_level:日志级别["NOTSET"|"DEBUG"|"INFO"|"WARNING"|"ERROR"|"CRITICAL"],默认为INFO :paramname:日志中打印的name,默认为运行程序的name :paramlog_name:日志文件的名字,默认为当前时间(年-月-日.log) :paramlog_path:日志文件夹的路径,默认为logger.py同级目录中的log文件夹 :paramuse_console:是否在控制台打印,默认为True """ ifnotset_level: set_level=self._exec_type()#设置set_level为None,自动获取当前运行模式 self.__logger=logging.getLogger(name) self.setLevel(getattr(logging,set_level.upper())ifhasattr(logging,set_level.upper())elselogging.INFO)#设置日志级别 ifnotos.path.exists(log_path):#创建日志目录 os.makedirs(log_path) formatter=logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-%(message)s") handler_list=list() handler_list.append(logging.FileHandler(os.path.join(log_path,log_name),encoding="utf-8")) ifuse_console: handler_list.append(logging.StreamHandler()) forhandlerinhandler_list: handler.setFormatter(formatter) self.addHandler(handler) def__getattr__(self,item): returngetattr(self.logger,item) @property deflogger(self): returnself.__logger @logger.setter deflogger(self,func): self.__logger=func def_exec_type(self): return"DEBUG"ifos.environ.get("IPYTHONENABLE")else"INFO"
singleton.py
classSingleton: """ 单例装饰器。 """ __cls=dict() def__init__(self,cls): self.__key=cls def__call__(self,*args,**kwargs): ifself.__keynotinself.cls: self[self.__key]=self.__key(*args,**kwargs) returnself[self.__key] def__setitem__(self,key,value): self.cls[key]=value def__getitem__(self,item): returnself.cls[item] @property defcls(self): returnself.__cls @cls.setter defcls(self,cls): self.__cls=cls
demo.py
importlogger x=logger.Logger("debug") x.critical("这是一个critical级别的问题!") x.error("这是一个error级别的问题!") x.warning("这是一个warning级别的问题!") x.info("这是一个info级别的问题!") x.debug("这是一个debug级别的问题!") x.log(50,"这是一个critical级别的问题的另一种写法!") x.log(40,"这是一个error级别的问题的另一种写法!") x.log(30,"这是一个warning级别的问题的另一种写法!") x.log(20,"这是一个info级别的问题的另一种写法!") x.log(10,"这是一个debug级别的问题的另一种写法!") x.log(51,"这是一个Level51级别的问题!") x.log(11,"这是一个Level11级别的问题!") x.log(9,"这条日志等级低于debug,不会被打印") x.log(0,"这条日志同样不会被打印") """ 运行结果: 2018-10-1200:18:06,562-demo-CRITICAL-这是一个critical级别的问题! 2018-10-1200:18:06,562-demo-ERROR-这是一个error级别的问题! 2018-10-1200:18:06,562-demo-WARNING-这是一个warning级别的问题! 2018-10-1200:18:06,562-demo-INFO-这是一个info级别的问题! 2018-10-1200:18:06,562-demo-DEBUG-这是一个debug级别的问题! 2018-10-1200:18:06,562-demo-CRITICAL-这是一个critical级别的问题的另一种写法! 2018-10-1200:18:06,562-demo-ERROR-这是一个error级别的问题的另一种写法! 2018-10-1200:18:06,562-demo-WARNING-这是一个warning级别的问题的另一种写法! 2018-10-1200:18:06,562-demo-INFO-这是一个info级别的问题的另一种写法! 2018-10-1200:18:06,562-demo-DEBUG-这是一个debug级别的问题的另一种写法! 2018-10-1200:18:06,562-demo-Level51-这是一个Level51级别的问题! 2018-10-1200:18:06,562-demo-Level11-这是一个Level11级别的问题! """ 2018-10-12.log 2018-10-1200:18:06,562-demo-CRITICAL-这是一个critical级别的问题! 2018-10-1200:18:06,562-demo-ERROR-这是一个error级别的问题! 2018-10-1200:18:06,562-demo-WARNING-这是一个warning级别的问题! 2018-10-1200:18:06,562-demo-INFO-这是一个info级别的问题! 2018-10-1200:18:06,562-demo-DEBUG-这是一个debug级别的问题! 2018-10-1200:18:06,562-demo-CRITICAL-这是一个critical级别的问题的另一种写法! 2018-10-1200:18:06,562-demo-ERROR-这是一个error级别的问题的另一种写法! 2018-10-1200:18:06,562-demo-WARNING-这是一个warning级别的问题的另一种写法! 2018-10-1200:18:06,562-demo-INFO-这是一个info级别的问题的另一种写法! 2018-10-1200:18:06,562-demo-DEBUG-这是一个debug级别的问题的另一种写法! 2018-10-1200:18:06,562-demo-Level51-这是一个Level51级别的问题! 2018-10-1200:18:06,562-demo-Level11-这是一个Level11级别的问题!
以上这篇python3logging日志封装实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。