在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编程开发之类型转换convert实例分析
Nov 13 Python
Python中的id()函数指的什么
Oct 17 Python
将Dataframe数据转化为ndarry数据的方法
Jun 28 Python
python批量从es取数据的方法(文档数超过10000)
Dec 27 Python
Python基础学习之类与实例基本用法与注意事项详解
Jun 17 Python
Django用户认证系统 Web请求中的认证解析
Aug 02 Python
Python中pymysql 模块的使用详解
Aug 12 Python
python 列表推导式使用详解
Aug 29 Python
简单了解Python3 bytes和str类型的区别和联系
Dec 19 Python
python深copy和浅copy区别对比解析
Dec 26 Python
Python如何在单元测试中给对象打补丁
Aug 03 Python
使用python创建股票的时间序列可视化分析
Mar 03 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类
2006/10/09 PHP
PHP教程 变量定义
2009/10/23 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
JavaScript实现多种排序算法
2016/02/24 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
2016/04/26 Javascript
简单学习vue指令directive
2016/11/03 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
jquery获取transform里的值实现方法
2017/12/12 jQuery
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
南京青奥会口号
2014/06/12 职场文书
鼓舞士气的口号
2014/06/16 职场文书
2014年保洁工作总结
2014/11/24 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
纪检干部学习心得体会
2016/01/23 职场文书
如何用JavaScript检测当前浏览器是无头浏览器
2021/04/27 Javascript
springboot临时文件存储目录配置方式
2021/07/01 Java/Android