Python 封装log类,实现字体颜色控制.

介绍

  • 写这个类的初衷是想自己控制日志,找了许多现成的库,发现问题都很多.
  • loguru比较好实用,但是发现无法异步调用.一旦异步调用,会导致日志信息记录混乱.

demo

优点
  • 线程安全.
  • 颜色可配置.
  • 代码逻辑明了,容易再加工.
缺点
  • 功能不完善,邮件,钉钉等发送没配置.
  • __get_log_path这个模块要手动配置项目路径.
import logging
class Loggers:
    '''日志配置类'''

    log_colors = {
        'green': '\033[0;32;m',  # 绿色
        'blue': '\033[0;34;m',  # 蓝色
        'yellow': '\033[0;33;m',  # 黄色
        'navy': '\033[0;36;m',  # 藏青色
    }
    PROJECT_NAME = ''

    def __init__(self, logName='null', level='DEBUG'):
        self.logName = self.__get_log_path(logName)
        self.logger = logging.getLogger()
        self.logger.setLevel(logging.DEBUG)
        if level == 'INFO': self.logger.setLevel(logging.INFO)
        self.formatter_console = logging.Formatter(
            f'{Loggers.log_colors["green"]}%(asctime)s | {Loggers.log_colors["blue"]}%(levelname)-8s | %(module)s:%(funcName)s:%(lineno)d -> {Loggers.log_colors["navy"]}%(message)s')  # 日志输出格式-控制台
        self.formatter_local = logging.Formatter(
            '%(asctime)s | %(levelname)-8s | %(module)s:%(funcName)s:%(lineno)d -> %(message)s')  # 日志输出格式-文件
        # self.handle_logs()

    def __get_log_path(self, logName) -> str:
        '''
        设置log文件保存位置:
        日志存放路径:项目名称/logs/.
        '''
        path = os.getcwd()
        if re.search('markets-data', path):
            path = path.split('markets-data')[0] + 'markets-data/'
        else:
            path = path.split('markets')[0] + 'markets/'
        time_ymd = time.strftime('%Y-%m-%d', time.localtime())
        return f'{path}logs/{logName}_{time_ymd}.log'

    def get_logger(self):
        '''
        获取打印器
        解决重复打印问题:
            核心原因是每次调用longing,没有生成一个新的logger;
            方式一: 每次调用清空Handler
                    self.logger.handlers.clear()
            方式二: 向前判断
                    if not self.logger.handlers:pass
        '''
        
        # 解决重复打印2:判断是否存在Handler
        if not self.logger.handlers:
            # 创建一个FileHandler,用于写到日志文件
            fh = RotatingFileHandler(filename=self.logName, mode='a', maxBytes=1024 * 1024 * 5, backupCount=5, encoding='utf-8')  # 使用RotatingFileHandler类,滚动备份日志
            fh.setLevel(logging.INFO)
            fh.setFormatter(self.formatter_local)
            self.logger.addHandler(fh)

            # 创建一个StreamHandler,用于输出到控制台
            ch = logging.StreamHandler()
            ch.setLevel(logging.INFO)
            ch.setFormatter(self.formatter_console)
            self.logger.addHandler(ch)
        return self.logger

你可能感兴趣的:(Python)