您的位置:首页

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

2018-07-27 17:46 696 查看
之前发过日志,再增加一种模板。

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安装:

pipinstall-ihttps://pypi.org/simple/--upgrademultiprocessing_log_manager可以不指定安装源,阿里和豆瓣的镜像是定时更新pypi官方包。

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





模板4,对pycahrm更友好






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

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




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


classColorHandler(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):
iflen(string)>length*2:
returnstring
custom_length=0
forwinstring:
custom_length+=1ifcls._is_ascii_word(w)else2
ifcustom_length<length:
place_length=length-custom_length
string+=''*place_length
returnstring

@staticmethod
def_is_ascii_word(w):
iford(w)<128:
returnTrue

defemit(self,record):
"""
3040黑色
3141红色
3242绿色
3343黃色
3444蓝色
3545紫红色
3646青蓝色
3747白色
:typerecord:logging.LogRecord
:return:
"""

ifself.formatterisformatter_dict[4]orself.formatterisself.formatter_new:
self.formatter=self.formatter_new
ifos.name=='nt':
self.__emit_for_fomatter4_pycahrm(record)#如果是使用第四种模板,并且是pycahrm运行py文件
else:
self.__emit_for_fomatter4_linux(record)#如果是使用第四种模板,是在linux上运行py文件
else:
self.__emit(record)#如果是使用第123种模板

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)
ifrecord.levelno==10:
print('\033[0;32m%s'%self._my_align(msg,150)+file_formatter)
elifrecord.levelno==20:
print('\033[0;96m%s'%self._my_align(msg,150)+file_formatter)
elifrecord.levelno==30:
print('\033[0;33m%s'%self._my_align(msg,150)+file_formatter)
elifrecord.levelno==40:
print('\033[0;35m%s'%self._my_align(msg,150)+file_formatter)
elifrecord.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)
ifrecord.levelno==10:
print('\033[0;32m%s\033[0m'%self._my_align(msg,200)+file_formatter)#绿色
elifrecord.levelno==20:
print('\033[0;34m%s\033[0m'%self._my_align(msg,200)+file_formatter)#青蓝色
elifrecord.levelno==30:
print('\033[0;92m%s\033[0m'%self._my_align(msg,200)+file_formatter)#蓝色
elifrecord.levelno==40:
print('\033[0;35m%s\033[0m'%self._my_align(msg,200)+file_formatter)#紫红色
elifrecord.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)
ifrecord.levelno==10:
print('\033[0;32m%s\033[0m'%msg)#绿色
elifrecord.levelno==20:
print('\033[0;34m%s\033[0m'%msg)#青蓝色
elifrecord.levelno==30:
print('\033[0;92m%s\033[0m'%msg)#蓝色
elifrecord.levelno==40:
print('\033[0;35m%s\033[0m'%msg)#紫红色
elifrecord.levelno==50:
print('\033[0;31m%s\033[0m'%msg)#血红色
except(KeyboardInterrupt,SystemExit):
raise
except:#NOQA
self.handleError(record)





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: