在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错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
Jun 17 Python
python递归查询菜单并转换成json实例
Mar 27 Python
pandas的object对象转时间对象的方法
Apr 11 Python
python解决字符串倒序输出的问题
Jun 25 Python
详解Django中六个常用的自定义装饰器
Jul 04 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 Python
python中的列表与元组的使用
Aug 08 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
Python类class参数self原理解析
Nov 19 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
咖啡语言
2021/03/03 咖啡文化
php简单静态页生成过程
2008/03/27 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
Python中扩展包的安装方法详解
2017/06/14 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
用TensorFlow实现戴明回归算法的示例
2018/05/02 Python
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
销售类个人求职信范文
2013/09/25 职场文书
中国文明网签名寄语
2014/01/18 职场文书
幼儿园实习生辞职信
2014/01/20 职场文书
《那片绿绿的爬山虎》教学反思
2014/02/27 职场文书
《春天来了》教学反思
2014/04/07 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
教师个人自我评价
2015/03/04 职场文书
服装区域经理岗位职责
2015/04/10 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书