在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排序搜索基本算法之希尔排序实例分析
Dec 09 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
Python实现的拉格朗日插值法示例
Jan 08 Python
详解python实现小波变换的一个简单例子
Jul 18 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
python 进程间数据共享multiProcess.Manger实现解析
Sep 23 Python
详解有关PyCharm安装库失败的问题的解决方法
Feb 02 Python
python tkinter 设置窗口大小不可缩放实例
Mar 04 Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 Python
python实现mask矩阵示例(根据列表所给元素)
Jul 30 Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 Python
Python爬取科目四考试题库的方法实现
Mar 30 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
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
php中实现简单的ACL 完结篇
2011/09/07 PHP
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
javascript实现动态标签云
2015/10/16 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
2017/01/26 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
集成vue到jquery/bootstrap项目的方法
2018/02/10 jQuery
Node.js使用Angular简单示例
2018/05/11 Javascript
jQuery基于Ajax实现读取XML数据功能示例
2018/05/31 jQuery
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
jQuery Ajax async=>false异步改为同步时,解决导致浏览器假死的问题
2019/07/22 jQuery
原生JS实现烟花效果
2020/03/10 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
下载糗事百科的内容_python版
2008/12/07 Python
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
django model去掉unique_together报错的解决方案
2016/10/18 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
2018/09/04 Python
django页面跳转问题及注意事项
2019/07/18 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
python中time.ctime()实例用法
2021/02/03 Python
CSS教程:CSS3圆角属性
2009/04/02 HTML / CSS
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
英国的屈臣氏:Boots博姿
2017/12/23 全球购物
Java模拟试题
2014/11/10 面试题
事业单位辞职信范文
2014/01/19 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
小学教师自我评价
2015/03/04 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书