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

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

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

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

        废话少说,直接上代码,注意:以下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)
            _handler.suffix = "%Y-%m-%d.log"
            _handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log$")
            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、效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术探索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值