在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实现多线程下载文件的代码实例
Jun 01 Python
python中的全局变量用法分析
Jun 09 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
详解Python中映射类型(字典)操作符的概念和使用
Aug 19 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
Apr 20 Python
python实现的AES双向对称加密解密与用法分析
May 02 Python
淘宝秒杀python脚本 扫码登录版
Sep 19 Python
python实现机器人卡牌
Oct 06 Python
python 实现方阵的对角线遍历示例
Nov 29 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 Python
python读取mnist数据集方法案例详解
Sep 04 Python
再谈python_tkinter弹出对话框创建
Mar 20 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中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
PHP/HTML混写的四种方式总结
2017/02/27 PHP
js实现DIV的一些简单控制
2007/06/04 Javascript
jquery json 实例代码
2010/12/02 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
JS如何设置元素样式的方法示例
2017/08/28 Javascript
angular5 httpclient的示例实战
2018/03/12 Javascript
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
jquery实现拖拽添加元素功能
2020/12/01 jQuery
python基于socket实现网络广播的方法
2015/04/29 Python
让python在hadoop上跑起来
2016/01/27 Python
Python多线程实现同步的四种方式
2017/05/02 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
2019/08/14 Python
python 魔法函数实例及解析
2019/09/25 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
基于pycharm实现批量修改变量名
2020/06/02 Python
Lands’ End官网:经典的美国生活方式品牌
2016/08/14 全球购物
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
业务助理岗位职责
2013/11/18 职场文书
测绘工程专业个人自我评价
2013/12/01 职场文书
消防安全员岗位职责
2014/03/10 职场文书
什么是就业协议书
2014/04/17 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
温馨祝福晨语:美丽的一天从我的问候开始
2019/11/28 职场文书
MongoDB安装使用并实现Python操作数据库
2021/06/28 MongoDB