在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 相关文章推荐
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
pandas 空的dataframe 插入列名的示例
Oct 30 Python
Python小工具之消耗系统指定大小内存的方法
Dec 03 Python
django开发post接口简单案例,获取参数值的方法
Dec 11 Python
python对象与json相互转换的方法
May 07 Python
python 杀死自身进程的实现方法
Jul 01 Python
Pandas的read_csv函数参数分析详解
Jul 02 Python
python实现截取屏幕保存文件,删除N天前截图的例子
Aug 27 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
python IP地址转整数
Nov 20 Python
Django中session进行权限管理的使用
Jul 09 Python
Python  lambda匿名函数和三元运算符
Apr 19 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中OR与|| AND与&&的区别总结
2013/10/26 PHP
浅析php数据类型转换
2014/01/09 PHP
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
php实现微信公众号企业转账功能
2018/10/01 PHP
php+ajax实现文件切割上传功能示例
2020/03/03 PHP
firefox插件Firebug的使用教程
2010/01/02 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
js实现网站首页图片滚动显示
2013/02/04 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
jquery实现图片按比例缩放示例
2014/07/01 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
在 Node.js 中使用原生 ES 模块方法解析
2017/09/19 Javascript
小程序分页实践之编写可复用分页组件
2019/07/18 Javascript
微信小程序实现带放大效果的轮播图
2020/05/26 Javascript
H5 js点击按钮复制文本到粘贴板
2020/11/19 Javascript
js中实现继承的五种方法
2021/01/25 Javascript
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
python和ruby,我选谁?
2017/09/13 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
Python Numpy数组扩展repeat和tile使用实例解析
2019/12/09 Python
Python将列表中的元素转化为数字并排序的示例
2019/12/25 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
经典的班主任推荐信
2013/10/28 职场文书
机械电子工程专业推荐信范文
2013/11/20 职场文书
大学生村官心得体会范文
2014/01/04 职场文书
公司合作协议范文
2014/10/01 职场文书
员工自我评价范文
2015/03/11 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python
netty 实现tomcat的示例代码
2022/06/05 Servers