在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连接MySQL数据库实例分析
May 12 Python
Python 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
利用Pandas 创建空的DataFrame方法
Apr 08 Python
python3+PyQt5实现柱状图
Apr 24 Python
Django项目中包含多个应用时对url的配置方法
May 30 Python
python生成九宫格图片
Nov 19 Python
python中sort和sorted排序的实例方法
Aug 26 Python
基于keras中的回调函数用法说明
Jun 17 Python
pandas map(),apply(),applymap()区别解析
Feb 24 Python
Python序列化与反序列化相关知识总结
Jun 08 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Jun 09 Python
Python数据处理的三个实用技巧分享
Apr 01 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
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
JS检测图片大小的实例
2013/08/21 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
超详细的JS弹出窗口代码大全
2020/04/18 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
Python编程之属性和方法实例详解
2015/05/19 Python
Python3 模块、包调用&路径详解
2017/10/25 Python
浅析Python3爬虫登录模拟
2018/02/07 Python
python绘制散点图并标记序号的方法
2018/12/11 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
高中毕业自我鉴定
2013/12/16 职场文书
CAD制图人员的自荐信
2014/02/07 职场文书
铁路安全事故反思
2014/04/26 职场文书
行政监察建议书
2014/05/19 职场文书
优秀毕业生求职信
2014/06/05 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
2014年保卫工作总结
2014/12/05 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
电台广播稿范文
2015/08/19 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
2016年五一促销广告语
2016/01/28 职场文书