用户故事:
训练神经网络的时候,我们的网络结构是有一个train.py文件,用来初始化model需要的东西,然后在每个epoch里面调用另外一个function.py文件来做真正的model训练。此时有个需求,想要这两个文件打印的logger都打印到同一个文件里面。因此根据上网检索大致自定义了一个管理日志的模块。
遇到的问题
如果直接在function里面生成日志并打印的话,会创建多个logger对象,会导致一个信息会打印多此。 因此可以用一个global来解决多个logger。
解决方法
下面演示大致的流程。主要包含三个文件,日志都打印在同一个文件下面
utils_log.py - logger的生成工厂
test1.py - 打印日志并且在循环里面调用test2.py
test2.py - 打印日志
utils_log.py
#!/usr/bin/python# -*- coding:utf8 -*- Author: Haoming Chen E-mail: chenhaomingbob@163.com Time: 2020/06/03 Description:import loggingimport timeimport osfrom sheen import ColoredHandlerfrom project_utils import utils_io_folderclass LogFactory(object): def __init__(self, logger=None, log_dir="", phase='train'): """ 指定保存日志的文件路径,日志级别,以及调用文件 将日志存入到指定的文件中 """ self.log_path = os.path.join(os.getcwd(), "log") if log_dir == "" else log_dir utils_io_folder.create_folder(self.log_path) # 创建一个logger 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()) # create file handler which logs even debug messages file_handler = logging.FileHandler(self.log_name) file_handler.setLevel(logging.DEBUG) # create console handler with a higher log level console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # # 再创建一个handler,用于输出到控制台 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) def get_log(self): return self.logger
test1~~~~.py
#!/usr/bin/python# -*- coding:utf8 -*-""" Author: Haoming Chen E-mail: chenhaomingbob@163.com Time: 2020/06/10 Description:"""from common.utils_log import LogFactorylogger = Nonedef test(): global logger if logger == None: logger = LogFactory(__name__, log_dir="F:/", phase='train').get_log() for i in range(10): logger.info("test1-1-{}".format(i))
test2.py
#!/usr/bin/python# -*- coding:utf8 -*-""" Author: Haoming Chen E-mail: chenhaomingbob@163.com Time: 2020/06/10 Description:"""from common.utils_log import LogFactoryfrom test_log import test1def main(): logger = LogFactory(__name__, log_dir="F:/", phase='train').get_log() for i in range(10): test1.test() logger.info("test2-1-{}".format(i)) for i in range(10): logger.info("test2-2-{}".format(i))if __name__ == '__main__': main()