一个日志模板,从traceback打印异常受启发做的模板,可被pycharm esclip sublime等ide识别和跳转
Posted 北风之神0509
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个日志模板,从traceback打印异常受启发做的模板,可被pycharm esclip sublime等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中带有\\033 @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 + \'\\033[7mFile "%s", line %d\\033[0m\' % (record.pathname, record.lineno) if record.levelno == 10: print(\'\\033[0;32m%s\' % self._my_align(msg, 150) + file_formatter) elif record.levelno == 20: print(\'\\033[0;96m%s\' % self._my_align(msg, 150) + file_formatter) elif record.levelno == 30: print(\'\\033[0;33m%s\' % self._my_align(msg, 150) + file_formatter) elif record.levelno == 40: print(\'\\033[0;35m%s\' % self._my_align(msg, 150) + file_formatter) elif record.levelno == 50: print(\'\\033[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): # \\033[0;93;107mFile "%(pathname)s", line %(lineno)d, in %(funcName)s\\033[0m try: msg = self.format(record) for_linux_formatter = \' \' * 10 + \'\\033[7m;File "%s", line %d\\033[0m\' % (record.pathname, record.lineno) file_formatter = \' \' * 10 + \'\\033[0;93;107mFile "%s", line %d\\033[0m\' % (record.pathname, record.lineno) if record.levelno == 10: print(\'\\033[0;32m%s\\033[0m\' % self._my_align(msg, 200) + file_formatter) # 绿色 elif record.levelno == 20: print(\'\\033[0;34m%s\\033[0m\' % self._my_align(msg, 200) + file_formatter) # 青蓝色 elif record.levelno == 30: print(\'\\033[0;92m%s\\033[0m\' % self._my_align(msg, 200) + file_formatter) # 蓝色 elif record.levelno == 40: print(\'\\033[0;35m%s\\033[0m\' % self._my_align(msg, 200) + file_formatter) # 紫红色 elif record.levelno == 50: print(\'\\033[0;31m%s\\033[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(\'\\033[0;32m%s\\033[0m\' % msg) # 绿色 elif record.levelno == 20: print(\'\\033[0;34m%s\\033[0m\' % msg) # 青蓝色 elif record.levelno == 30: print(\'\\033[0;92m%s\\033[0m\' % msg) # 蓝色 elif record.levelno == 40: print(\'\\033[0;35m%s\\033[0m\' % msg) # 紫红色 elif record.levelno == 50: print(\'\\033[0;31m%s\\033[0m\' % msg) # 血红色 except (KeyboardInterrupt, SystemExit): raise except: # NOQA self.handleError(record)
以上是关于一个日志模板,从traceback打印异常受启发做的模板,可被pycharm esclip sublime等ide识别和跳转的主要内容,如果未能解决你的问题,请参考以下文章