在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数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
Jan 03 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
Jun 13 Python
Django 连接sql server数据库的方法
Jun 30 Python
详解Django中间件执行顺序
Jul 16 Python
linux下安装python3和对应的pip环境教程详解
Jul 01 Python
python 使用shutil复制图片的例子
Dec 13 Python
python标准库os库的函数介绍
Feb 12 Python
通过python连接Linux命令行代码实例
Feb 18 Python
pytorch 中的重要模块化接口nn.Module的使用
Apr 02 Python
解决python 输出到csv 出现多空行的情况
Mar 24 Python
python状态机transitions库详解
Jun 02 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设计模式 Delegation(委托模式)
2011/06/26 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
Mootools 1.2 手风琴(Accordion)教程
2009/09/15 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
JQuery下拉框应用示例介绍
2014/04/23 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
基于VUE的v-charts的曲线显示功能
2019/10/01 Javascript
微信小程序实现上拉加载功能
2019/11/20 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
Python中type的构造函数参数含义说明
2015/06/21 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
Django Highcharts制作图表
2016/08/27 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
python中append实例用法总结
2019/07/30 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
软件测试工程师面试问题精选
2016/10/28 面试题
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
老公保证书
2015/01/17 职场文书
毕业生自荐信范文
2015/03/05 职场文书
营运督导岗位职责
2015/04/10 职场文书
《鲁班学艺》读后感3篇
2019/11/27 职场文书
python如何进行基准测试
2021/04/26 Python
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS