Python-自定义日志模块

用户故事:

训练神经网络的时候,我们的网络结构是有一个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 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()

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理