在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装饰器 免去调用父类构造函数的麻烦
May 18 Python
python基于queue和threading实现多线程下载实例
Oct 08 Python
python实现数值积分的Simpson方法实例分析
Jun 05 Python
Python的Django框架中if标签的相关使用
Jul 15 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
Apr 01 Python
使用python画社交网络图实例代码
Jul 10 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
Feb 07 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
Nov 09 Python
用Python可视化新冠疫情数据
Jan 18 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
Apr 21 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快速查找数据库中恶意代码的方法
2015/04/01 PHP
详解PHP中的PDO类
2015/07/06 PHP
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
javascript for循环设法提高性能
2010/02/24 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
javascript点击按钮实现隐藏显示切换效果
2016/02/03 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
2020/06/19 Javascript
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
Django forms表单 select下拉框的传值实例
2019/07/19 Python
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
审核会计岗位职责
2013/11/08 职场文书
无故旷工检讨书
2014/01/26 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书
委托公证书格式
2015/01/26 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
2015年教研组工作总结
2015/05/04 职场文书
素质教育培训心得体会
2016/01/19 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL