python3 输出日志的正确打开方式(二)

自定义日志方式书写python日志

        使用logging.config.fileConfig(),读取配置文件的方式,虽然提供了灵活方便的渠道,仅仅可以通过修改配置即可达到目的,但是对于需要自定义日志的同学显然满足不了要求。

        且看自定义日志该如何写作,以下代码实现了根据不同模块,创建相应目录,日志文件的功能,日志文件命名为:模块_日志.log。

1、创建log.py

import logging
import logging.handlers
import os
import datetime

LOG_PATH_BASE="/log/"
DEFAULT_LOGNAME="app.log"

class log():
    def __init__(self, module_name="test",log_level=logging.DEBUG):
        self.__module_name = module_name
        self.__log_level = log_level

    #output log to console
    def get_console_logger(self):
        def _gen_file_logger_handler():
            _handler = logging.StreamHandler()
            formatter = logging.Formatter(
                "%(asctime)s - %(filename)s[line:%(lineno)d][%(levelname)s]: %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
            _handler.setLevel(logging.DEBUG)
            _handler.setFormatter(formatter)
            return _handler
        def _gen_console_logger():
            _console_logger = logging.getLogger("console_logger")
            _console_logger.addHandler(handler)
            return _console_logger

        handler = _gen_file_logger_handler()
        console_logger = _gen_console_logger()
        return console_logger

    #output log to module log file
    def get_file_logger(self):
        #
        def _get_log_file_name():
            # 
            if __name__ == "__main__":
                caller_log_name = DEFAULT_LOGNAME
            else:
                nowTime = datetime.datetime.now().strftime('%Y-%m-%d')
                caller_log_name = self.__module_name + "_" + nowTime + ".log"
            return caller_log_name

        #
        def _gen_file_logger_handler(log_name = DEFAULT_LOGNAME):

            log_file_dir = LOG_PATH_BASE + self.__module_name + "/"

            if not os.path.isdir(log_file_dir):
                os.makedirs(log_file_dir)
            file_path = f'{log_file_dir}/{log_name}'

            formatter = logging.Formatter(
                "%(asctime)s - %(filename)s[line:%(lineno)d][%(levelname)s]: %(message)s", datefmt="%Y-%m-%d %H:%M:%S")

            _handler = logging.handlers.TimedRotatingFileHandler(
                filename=file_path,
                when='D',
                interval=1,
                backupCount=31,
                encoding='utf-8',
            )

            _handler.setLevel(self.__log_level)
            _handler.setFormatter(formatter)
            return _handler
        #
        def _gen_file_logger():
            _file_logger = logging.getLogger(self.__module_name)
            _file_logger.addHandler(handler)
            _file_logger.setLevel(self.__log_level)
            return _file_logger


        log_file_name = _get_log_file_name()
        handler = _gen_file_logger_handler(log_file_name)
        file_logger = _gen_file_logger()

        return file_logger

if __name__ == "__main__":
    #args is module name
    logger = log("test").get_file_logger()

    logger.debug('print by debug')
    logger.info('print by info')
    logger.warning('print by warning')
    logger.error("print by error")
    logger.critical("print by critical")

2、其他模块调用

      创建test_log.py


from log import log

if __name__ == "__main__":
    #
    logger = log("celery").get_file_logger()

    logger.debug('print by debug')
    logger.info('print by info')
    logger.warning('print by warning')
    logger.error("print by error")
    logger.critical("print by critical")

3、效果

猜你喜欢

转载自blog.csdn.net/hhd1988/article/details/108703570