当前位置: 首页 > 后端技术 > Python

Python自定义日志模块

时间:2023-03-25 20:22:05 Python

原因:在训练神经网络时,我们的网络结构有一个train.py文件。用来初始化模型需要的东西,然后在每个epoch调用另一个function.pytrain方法,做真正的模型训练。需求此时有需求,这两个文件打印的logger可以动态打印在同一个文件中。因此,管理日志的模块大致是基于互联网检索定制的。遇到的问题如果直接在function.py中生成并打印日志,由于for循环的问题,会多次调用function.py的一个函数,每个函数都会创建一个logger对象,最终会导致到创建多个记录器对象,以便打印消息将打印多次。解决方法是用一个global来解决多个logger。~~~~具体做法下面演示一下大致过程。主要包括三个文件,日志都打印在同一个文件下。utils_log.py-记录器生成工厂test1.py-打印日志并在循环中调用test2.pytest2.py-打印日志utils_log.py#!/usr/bin/python#-*-coding:utf8-*-Author:HaomingChenE-mail:chenhaomingbob@163.com时间:2020/06/03描述:importloggingimporttimeimportosfromsheenimportColoredHandlerfromproject_utilsimportutils_io_folderclassLogFactory(object):def__init__(self,logger=None,log_dir="",phase='train'):"""指定保存日志的文件路径,日志级别,调用文件将日志存放在指定文件中。"""self.log_path=os.path.join(os.getcwd(),"log")iflog_dir==""elselog_dirutils_io_folder.create_folder(self.log_path)#创建记录器self.logger=logging.getLogger(logger)self.logger.addHandler(ColoredHandler())self.logger.setLevel(logging.DEBUG)self.log_name=os.path.join(self.log_path,"{}-{}.log".format(phase,time.strftime("%Y_%m_%d_%H")))self.logger.addHandler(ColoredHandler())#创建甚至记录调试消息的文件处理程序file_handler=logging.FileHandler(self.log_name)file_handler.setLevel(logging.DEBUG)#创建具有更高日志级别的控制台处理程序console_handler=logging.StreamHandler()console_handler.setLevel(logging.INFO)##再创建一个处理程序,用于输出到控制台formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')file_handler.setFormatter(formatter)console_handler.setFormatter(formatter)self.logger.addHandler(file_handler)self.logger.addHandler(console_handler)defget_log(self):returnself.loggertest1~~~~.py#!/usr/bin/python#-*-coding:utf8-*-"""作者:陈浩明E-mail:chenhaomingbob@163.com时间:2020/06/10描述:"""fromcommon.utils_logimportLogFactorylogger=Noneseftest():globallogger如果logger==None:logger=LogFactory(__name__,log_dir="F:/",phase='train').get_log()foriinrange(10):logger.info("test1-1-{}".format(i))test2.py#!/usr/bin/python#-*-coding:utf8-*-"""作者:陈浩明E-mail:chenhaomingbob@163.com时间:2020/06/10说明:"""fromcommon.utils_logimportLogFactoryfromtest_logimporttest1defmain():logger=LogFactory(__name__,log_dir="F:/",phase='train').get_log()foriinrange(10):test1.test()logger.info("test2-1-{}".format(i))foriinrange(10):logger.info("test2-{}".format(i))if__name__=='__main__':main()