• 一个日志模板,从traceback打印异常受启发做的模板,可被pycharm esclip 等ide识别和跳转



    之前发过日志,再增加一种模板。

    logging.Formatter('%(asctime)s - %(name)s - File "%(pathname)s", line %(lineno)d, in<%(funcName)s> - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"), # 一个模仿traceback异常的可跳转到打印日志地方的模板


    此模板是模拟traceback字符串的格式,因为traceback字符串被pycahrm等ide支持成跳转了,按照那个格式做日志模板,那么pycharm 控制台和日志文件都能很轻松跳转到指定文件的指定行。


    使用pip安装:
     pip install  -i https://pypi.org/simple/ --upgrade multiprocessing_log_manager 可以不指定安装源,阿里和豆瓣的镜像是定时更新pypi官方包。

    模板3
    控制台的日志是这样,可以直接点击链接,自动跳转到指定文件的指定行。

     
     模板4,对pycahrm更友好

     
    使用模板4,将自动识别linux系统,由于pycahrm在背景的反着色上有些不美观,所以在win上使用上面的样式

    当python程序判断运行的是linux系统,日志将自动切换模板,样式如下

     


    发出针对streamhandler的单独优化的handler

    class ColorHandler(logging.Handler):
        """彩色日志,根据不同级别的日志显示不同颜色"""
    
        def __init__(self, filter_logger_name_list=None):
            logging.Handler.__init__(self)
            self.formatter_new = logging.Formatter(
                '%(asctime)s - %(name)s - "%(filename)s" - %(funcName)s - %(lineno)d - %(levelname)s - %(message)s',
                "%Y-%m-%d %H:%M:%S")
            # 对控制台日志单独优化显示和跳转,单独对字符串某一部分使用特殊颜色,主要用于第四种模板,以免filehandler和mongohandler中带有33
    
        @classmethod
        def _my_align(cls, string, length):
            if len(string) > length *2:
                return  string
            custom_length = 0
            for w in string:
                custom_length += 1 if cls._is_ascii_word(w) else 2
            if custom_length < length:
                place_length = length - custom_length
                string += ' ' * place_length
            return string
    
        @staticmethod
        def _is_ascii_word(w):
            if ord(w) < 128:
                return True
    
        def emit(self, record):
            """
            30    40    黑色
            31    41    红色
            32    42    绿色
            33    43    黃色
            34    44    蓝色
            35    45    紫红色
            36    46    青蓝色
            37    47    白色
            :type record:logging.LogRecord
            :return:
            """
    
            if self.formatter is formatter_dict[4] or self.formatter is self.formatter_new:
                self.formatter = self.formatter_new
                if os.name == 'nt':
                    self.__emit_for_fomatter4_pycahrm(record)  # 如果是使用第四种模板,并且是pycahrm运行py文件
                else:
                    self.__emit_for_fomatter4_linux(record)    # 如果是使用第四种模板,是在linux上运行py文件
            else:
                self.__emit(record)                           # 如果是使用第1 2 3 种模板
    
        def __emit_for_fomatter4_linux(self, record):
            try:
                msg = self.format(record)
                file_formatter = ' ' * 10 + '33[7mFile "%s", line %d33[0m' % (record.pathname, record.lineno)
                if record.levelno == 10:
                    print('33[0;32m%s' % self._my_align(msg, 150) + file_formatter)
                elif record.levelno == 20:
                    print('33[0;96m%s' % self._my_align(msg, 150) + file_formatter)
                elif record.levelno == 30:
                    print('33[0;33m%s' % self._my_align(msg, 150) + file_formatter)
                elif record.levelno == 40:
                    print('33[0;35m%s' % self._my_align(msg, 150) + file_formatter)
                elif record.levelno == 50:
                    print('33[0;31m%s' % self._my_align(msg, 150) + file_formatter)
            except (KeyboardInterrupt, SystemExit):
                raise
            except:  # NOQA
                self.handleError(record)
    
    
        def __emit_for_fomatter4_pycahrm(self, record):
            #              33[0;93;107mFile "%(pathname)s", line %(lineno)d, in %(funcName)s33[0m
            try:
                msg = self.format(record)
                for_linux_formatter =  ' ' * 10 + '33[7m;File "%s", line %d33[0m' % (record.pathname, record.lineno)
                file_formatter = ' ' * 10 + '33[0;93;107mFile "%s", line %d33[0m' % (record.pathname, record.lineno)
                if record.levelno == 10:
                    print('33[0;32m%s33[0m' % self._my_align(msg, 200) + file_formatter) # 绿色
                elif record.levelno == 20:
                    print('33[0;34m%s33[0m' % self._my_align(msg, 200) + file_formatter)  # 青蓝色
                elif record.levelno == 30:
                    print('33[0;92m%s33[0m' % self._my_align(msg, 200) + file_formatter)  # 蓝色
                elif record.levelno == 40:
                    print('33[0;35m%s33[0m' % self._my_align(msg, 200) + file_formatter)  # 紫红色
                elif record.levelno == 50:
                    print('33[0;31m%s33[0m' % self._my_align(msg, 200) + file_formatter)  # 血红色
            except (KeyboardInterrupt, SystemExit):
                raise
            except:  # NOQA
                self.handleError(record)
    
        def __emit(self, record):
            try:
                msg = self.format(record)
                if record.levelno == 10:
                    print('33[0;32m%s33[0m' % msg)  # 绿色
                elif record.levelno == 20:
                    print('33[0;34m%s33[0m' % msg)  # 青蓝色
                elif record.levelno == 30:
                    print('33[0;92m%s33[0m' % msg)  # 蓝色
                elif record.levelno == 40:
                    print('33[0;35m%s33[0m' % msg)  # 紫红色
                elif record.levelno == 50:
                    print('33[0;31m%s33[0m' % msg)  # 血红色
            except (KeyboardInterrupt, SystemExit):
                raise
            except:  # NOQA
                self.handleError(record)
    
    
    
     
  • 相关阅读:
    loadrunner上传文件到网盘
    robotframework + appium 获取android toast
    jmeter 签名MD5生成
    python appium 封装获取toast方法
    java appium客户端 6.1.0android长按及滑动变更
    父类与子类 构造函数 变量 加载顺序
    检测安卓手机联网方式
    context menu与submenu区别
    div 居中
    ndk的一些概念
  • 原文地址:https://www.cnblogs.com/ydf0509/p/9378940.html
Copyright © 2020-2023  润新知