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

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 等ide识别和跳转的更多相关文章

  1. zoj 2676 dinic模板求实型最小割(可做dinic模板)

    #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #inc ...

  2. python traceback捕获并打印异常

    异常处理是日常操作了,但是有时候不能只能打印我们处理的结果,还需要将我们的异常打印出来,这样更直观的显示错误 下面来介绍traceback模块来进行处理 try: 1/0 except Excepti ...

  3. Springboot + SLF4j + Log4j2 打印异常日志时,耗时要5-6秒

    1.使用jps -l 查看springboot项目的进程ID 2.使用命令jstack -l 进程ID > log.txt 打印堆栈信息到文件,内容如下: "http-nio-8065 ...

  4. 在error日志打印异常

    在日志中打印异常,经常会看到以下的写法: logger.error(e.getMessage()); 或者是: e.printStackTrace(); 这两种其实都不太好. e.getMessage ...

  5. 使用 @Log4j2 log.error() 打印异常日志

    public static void main(String[] args) { int a = 10; try { int i = 1/0; } catch (Exception e) { Syst ...

  6. python日志,支持彩色打印和文件大小切片写入和写入mongodb

    1.项目中使用了自定义的ColorHandler和MongoHandler,使用了内置的RotatingFileHandler和三方库的ConcurrentRotatingFileHandler. 支 ...

  7. Golang把所有包括底层类库,输出到stderr的内容, 重新定向到一个日志文件里面?

    不论应用是如何部署的,我们都期望能扑捉到应用的错误日志, 解决思路: 自己写代码处理异常拦截,甚至直接在main函数中写异常拦截. stderr重定向到某个文件里 使用 syscall.Dup2 第一 ...

  8. Slf4j打印异常的堆栈信息

    一.前言 直接用logger.info("异常信息为:"+e)或者logger.info(e.getMessage())只能记录到异常的描述信息,却没有其异常具体发生在哪一行代码. ...

  9. 主库的wal日志已经被归档或异常丢失如何搭建从库

      关键字:wal日志归档  搭建从库 restore_command master 194.1 slave 194.4 wal归档目录 /backup/pgsql/pg_arch/ xlog目录 / ...

随机推荐

  1. Vagrant (1) —— 基本安装与配置(上)

    Vagrant (1) -- 基本安装与配置(上) 摘要 基本安装与配置 版本 Vagrant版本: 1.8.1 内容 启动运行 $ vagrant init hashicorp/precise64 ...

  2. java中反向转义org.apache.commons.lang3.StringEscapeUtils.unescapeJava

    工具类中包含类反向转义的方法: eorderHistory.setSubPrintTemplates(StringEscapeUtils.unescapeJava(eorderHistory.getS ...

  3. css限制显示字数,文字长度超出部分用省略号表示【转】

    为了保证页面的整洁美观,在很多的时候,我们常需要隐藏超出长度的文字.这在列表条目,题目,名称等地方常用到. (1).文字超出一行,省略超出部分,显示'...' 如果这种情况比较多,可以取一个切合作用的 ...

  4. JavaScript prototype背后的工作原理

    首先从一个函数说起 function fn1(name, age) { this.name = name; this.age = age; this.say = function() { alert( ...

  5. C艹复合类型(字符串)

    在C艹中有两种字符串形式, 一种是C-风格, 另一种是C艹风格的 初始化: char str[10] = {'a', 'c', 'd', '\0'};char str[20]= “aaa”; stri ...

  6. C++ 模板 template

    #include <iostream> using namespace std; /* 模板的作用: 1. 不用声明类型, 传什么进来就是什么类型, 返回也是什么类型 2. 方法封装起来, ...

  7. visual studio运行时库MT、MTd、MD、MDd 的区别

    msdn上面的解释: MT:mutithread,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库 MTd:mutithread+debug,多线程 ...

  8. JDBC删除表实例

    在本教程将演示如何在JDBC应用程序中删除一个数据库表. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式中删除数据库表. 要执行以下示例,需要用实际用户名和密码替 ...

  9. JDBC事务提交/回滚实例

    以下是使用事务教程中描述的提交和回滚的代码示例. 此示例代码是基于前面章节中完成的环境和数据库设置编写的. 复制并将以下示例代码保存到:CommitAndRollback.java 中,编译并运行如下 ...

  10. 关于对最新HTML总结PPT讲稿的分享

    如果大家还记得HTML,那么2009年的时候可能当时还是HTML1.0时代,而国际化的标准才刚刚开始,对于TABLE表格的使用,还有就是一些常用的标签都是及为简单的,因为当时的代码都是接近于短码,所以 ...