单例模式实现 logging 日志实例化

  • Post author:
  • Post category:其他




单例模式实现 logging 日志实例化

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import logging
import logging.handlers
import os


class Logger(object):
    __flag = None

    def __new__(cls, *args, **kwargs):
        if not cls.__flag:
            cls.__flag = super().__new__(cls)
        return cls.__flag

    def __init__(self, log_path):
        if 'logger' not in self.__dict__:
            logger = logging.getLogger()
            logger.setLevel(logging.INFO)
            formatter = logging.Formatter('%(asctime)s - %(process)d-%(threadName)s - '
                                          '%(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
            console_handler = logging.StreamHandler()
            console_handler.setFormatter(formatter)
            logger.addHandler(console_handler)
            file_handler = logging.handlers.RotatingFileHandler(
                log_path, maxBytes=10485760, backupCount=5, encoding="utf-8")
            file_handler.setFormatter(formatter)
            logger.addHandler(file_handler)
            self.logger = logger

    def return_logger(self):
        return self.logger


def get_logger(log_dir=None, log_filename=None):
    log_dir = log_dir if log_dir else os.path.join(os.getcwd(), "log")
    if not os.path.exists(log_dir):
        os.makedirs(log_dir, exist_ok=True)
    log_filename = log_filename if log_filename else 'log.log'
    log_path = os.path.join(log_dir, log_filename)
    return Log(log_path).return_logger()


logger = get_logger(log_filename='shzdsylog.log')

if __name__ == '__main__':
    logger.info('测试成功')
    logger.warning('测试成功')
    logger.error('测试成功')
    logger.critical('测试成功')



版权声明:本文为weixin_43665662原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。