在PyCharm中控制台输出日志分层级分颜色显示的方法


Posted in Python onJuly 11, 2019

1、把下面代码复制到一个.py文件中

#!/usr/bin/env python
# encoding: utf-8
import logging


# now we patch Python code to add color support to logging.StreamHandler
def add_coloring_to_emit_windows(fn):
  # add methods we need to the class
  def _out_handle(self):
    import ctypes
    return ctypes.windll.kernel32.GetStdHandle(self.STD_OUTPUT_HANDLE)

  out_handle = property(_out_handle)

  def _set_color(self, code):
    import ctypes
    # Constants from the Windows API
    self.STD_OUTPUT_HANDLE = -11
    hdl = ctypes.windll.kernel32.GetStdHandle(self.STD_OUTPUT_HANDLE)
    ctypes.windll.kernel32.SetConsoleTextAttribute(hdl, code)

  setattr(logging.StreamHandler, '_set_color', _set_color)

  def new(*args):
    FOREGROUND_BLUE = 0x0001 # text color contains blue.
    FOREGROUND_GREEN = 0x0002 # text color contains green.
    FOREGROUND_RED = 0x0004 # text color contains red.
    FOREGROUND_INTENSITY = 0x0008 # text color is intensified.
    FOREGROUND_WHITE = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED
    # winbase.h
    STD_INPUT_HANDLE = -10
    STD_OUTPUT_HANDLE = -11
    STD_ERROR_HANDLE = -12

    # wincon.h
    FOREGROUND_BLACK = 0x0000
    FOREGROUND_BLUE = 0x0001
    FOREGROUND_GREEN = 0x0002
    FOREGROUND_CYAN = 0x0003
    FOREGROUND_RED = 0x0004
    FOREGROUND_MAGENTA = 0x0005
    FOREGROUND_YELLOW = 0x0006
    FOREGROUND_GREY = 0x0007
    FOREGROUND_INTENSITY = 0x0008 # foreground color is intensified.

    BACKGROUND_BLACK = 0x0000
    BACKGROUND_BLUE = 0x0010
    BACKGROUND_GREEN = 0x0020
    BACKGROUND_CYAN = 0x0030
    BACKGROUND_RED = 0x0040
    BACKGROUND_MAGENTA = 0x0050
    BACKGROUND_YELLOW = 0x0060
    BACKGROUND_GREY = 0x0070
    BACKGROUND_INTENSITY = 0x0080 # background color is intensified.

    levelno = args[1].levelno
    if (levelno >= 50):
      color = BACKGROUND_YELLOW | FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_INTENSITY
    elif (levelno >= 40):
      color = FOREGROUND_RED | FOREGROUND_INTENSITY
    elif (levelno >= 30):
      color = FOREGROUND_YELLOW | FOREGROUND_INTENSITY
    elif (levelno >= 20):
      color = FOREGROUND_GREEN
    elif (levelno >= 10):
      color = FOREGROUND_MAGENTA
    else:
      color = FOREGROUND_WHITE
    args[0]._set_color(color)

    ret = fn(*args)
    args[0]._set_color(FOREGROUND_WHITE)
    # print "after"
    return ret

  return new


def add_coloring_to_emit_ansi(fn):
  # add methods we need to the class
  def new(*args):
    levelno = args[1].levelno
    if (levelno >= 50):
      color = '\x1b[31m' # red
    elif (levelno >= 40):
      color = '\x1b[31m' # red
    elif (levelno >= 30):
      color = '\x1b[33m' # yellow
    elif (levelno >= 20):
      color = '\x1b[32m' # green
    elif (levelno >= 10):
      color = '\x1b[35m' # pink
    else:
      color = '\x1b[0m' # normal
    try:
      args[1].msg = color + args[1].msg + '\x1b[0m' # normal
    except Exception as e:
      pass
    # print "after"
    return fn(*args)

  return new


import platform

if platform.system() == 'Windows':
  # Windows does not support ANSI escapes and we are using API calls to set the console color
  logging.StreamHandler.emit = add_coloring_to_emit_windows(logging.StreamHandler.emit)
else:
  # all non-Windows platforms are supporting ANSI escapes so we use them
  logging.StreamHandler.emit = add_coloring_to_emit_ansi(logging.StreamHandler.emit)
  # log = logging.getLogger()
  # log.addFilter(log_filter())
  # //hdlr = logging.StreamHandler()
  # //hdlr.setFormatter(formatter())

2、将文件放到项目的utils包中(或者项目其他路径)

3、在配置文件中导入这个py文件

比如在Django的setting.py文件中配置日志信息时,可以先导入这个文件

之后运行代码,控制台会根据日志等级显示不同的颜色

4、pycharm版本最好是17版本以上的

以上这篇在PyCharm中控制台输出日志分层级分颜色显示的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
介绍Python中的一些高级编程技巧
Apr 02 Python
python通过apply使用元祖和列表调用函数实例
May 26 Python
解决pandas使用read_csv()读取文件遇到的问题
Jun 15 Python
Python正则表达式指南 推荐
Oct 09 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
Jun 26 Python
浅谈python3中input输入的使用
Aug 02 Python
pytorch的梯度计算以及backward方法详解
Jan 10 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
pandas分组聚合详解
Apr 10 Python
全网最全python库selenium自动化使用详细教程
Jan 12 Python
python如何将mat文件转为png
Jul 15 Python
基于sklearn实现Bagging算法(python)
Jul 11 #Python
Python的log日志功能及设置方法
Jul 11 #Python
python使用装饰器作日志处理的方法
Jul 11 #Python
Python日志无延迟实时写入的示例
Jul 11 #Python
深入了解Python iter() 方法的用法
Jul 11 #Python
用python给自己做一款小说阅读器过程详解
Jul 11 #Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 #Python
You might like
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
jQuery 跨域访问问题解决方法
2009/12/02 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
2015/08/17 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
详解用原生JavaScript实现jQuery的某些简单功能
2016/12/19 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
python爬虫框架talonspider简单介绍
2017/06/09 Python
python操作excel的包(openpyxl、xlsxwriter)
2018/06/11 Python
Windows系统下PhantomJS的安装和基本用法
2018/10/21 Python
python解析xml简单示例
2019/06/21 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
Python基于WordCloud制作词云图
2019/11/29 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
2020/01/13 Python
python实现简单文件读写函数
2021/02/25 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
html5组织文档结构_动力节点Java学院整理
2017/07/11 HTML / CSS
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
解释下面关于J2EE的名词
2013/11/15 面试题
幼儿园庆六一游园活动方案
2014/01/29 职场文书
应届毕业生自荐信
2014/05/28 职场文书
承兑汇票转让证明怎么写?
2014/11/30 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
php中pcntl_fork详解
2021/04/01 PHP
golang switch语句的灵活写法介绍
2021/05/06 Golang
Django migrate报错的解决方案
2021/05/20 Python