在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切片及sys.argv[]用法详解
May 25 Python
python3 中文乱码与默认编码格式设定方法
Oct 31 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 Python
python烟花效果的代码实例
Feb 25 Python
Python如何使用paramiko模块连接linux
Mar 18 Python
如何基于线程池提升request模块效率
Apr 18 Python
基于python实现MQTT发布订阅过程原理解析
Jul 27 Python
python pip如何手动安装二进制包
Sep 30 Python
浅析Python requests 模块
Oct 09 Python
python tkinter的消息框模块(messagebox,simpledialog)
Nov 07 Python
如何用用Python将地址标记在地图上
Feb 07 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之OpCode原理详解
2016/06/01 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
jQuery中实现动画效果的基本操作介绍
2013/04/16 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
2014/01/13 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
浅谈window对象的scrollBy()方法
2015/07/15 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
2016/11/01 Javascript
零基础轻松学JavaScript闭包
2016/12/30 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
Js实现京东无延迟菜单效果实例(demo)
2017/06/02 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
2017/09/22 Javascript
JavaScript 中使用 Generator的方法
2017/12/29 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
Python使用QQ邮箱发送Email的方法实例
2017/02/09 Python
Python中创建字典的几种方法总结(推荐)
2017/04/27 Python
Python实现单词翻译功能
2017/06/06 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
numpy matrix和array的乘和加实例
2018/06/28 Python
python中join()方法介绍
2018/10/11 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
10个示例带你掌握python中的元组
2020/11/23 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
JDK安装目录下有哪些内容
2014/08/25 面试题
会计自我鉴定范文
2013/10/06 职场文书
测绘工程专业个人自我评价
2013/12/01 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
起诉状范本
2015/05/20 职场文书
美容院管理规章制度
2015/08/05 职场文书
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
关于EntityWrapper的in用法
2022/03/22 Java/Android
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android
Python实现科学占卜 让视频自动打码
2022/04/09 Python