The correct way to open python3 output log (two)

Custom log method to write python log

        Using logging.config.fileConfig() to read the configuration file, although it provides a flexible and convenient channel, the purpose can be achieved only by modifying the configuration, but it is obviously not enough for students who need to customize the log.

        Look at how to write a custom log. The following code implements the function of creating a corresponding directory and log file according to different modules. The log file is named: module_log.log.

1. Create 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. Calling other modules

      Create 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. Effect

Guess you like

Origin blog.csdn.net/hhd1988/article/details/108703570