起因:
- 训练神经网络的时候,我们的网络结构是有一个train.py文件。用来初始化model需要的东西,然后在每个epoch里面调用另外一个function.py的train方法来做真正的model训练。
需求
- 此时有个需求,想要能用动态的方式让这两个文件打印的logger都打印到同一个文件里面。因此根据上网检索大致自定义了一个管理日志的模块。
遇到的问题
- 如果直接在function.py里面生成日志并打印的话,由于for循环的问题,会多次调用function.py的一个function,每个function都会创建一个logger对象,最终导致创建多个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 logging
import time
import os
from sheen import ColoredHandler
from project_utils import utils_io_folder
class 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 LogFactory
logger = None
def 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 LogFactory
from test_log import test1
def 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()
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。