在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爬取Coursera课程资源的详细过程
Nov 04 Python
Python字符串处理函数简明总结
Apr 13 Python
Python从MP3文件获取id3的方法
Jun 15 Python
python开发简易版在线音乐播放器
Mar 03 Python
Python获取当前公网ip并自动断开宽带连接实例代码
Jan 12 Python
python实战教程之自动扫雷
Jul 13 Python
Linux下多个Python版本安装教程
Aug 15 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
使用Python发现隐藏的wifi
Mar 04 Python
浅谈在JupyterNotebook下导入自己的模块的问题
Apr 16 Python
Python如何在单元测试中给对象打补丁
Aug 03 Python
Python面向对象特殊属性及方法解析
Sep 16 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
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
PHP convert_uudecode()函数讲解
2019/02/14 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
js实现iframe动态调整高度的代码
2008/01/06 Javascript
javascript 贪吃蛇实现代码
2008/11/22 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
vue点击页面空白处实现保存功能
2019/11/06 Javascript
微信小程序实现滑动操作代码
2020/04/23 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
20行python代码实现人脸识别
2019/05/05 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
学生党员的自我评价范文
2014/03/01 职场文书
公司保密承诺书
2014/03/27 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
踏青活动策划方案
2014/08/19 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
简爱电影观后感
2015/06/10 职场文书
php去除数组中为0的元素的实例分析
2021/11/17 PHP
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技