在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 相关文章推荐
400多行Python代码实现了一个FTP服务器
May 10 Python
python2.7删除文件夹和删除文件代码实例
Dec 18 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 Python
python虚拟环境的安装配置图文教程
Oct 20 Python
python实现识别手写数字 python图像识别算法
Mar 23 Python
python实现桌面气泡提示功能
Jul 29 Python
Django 1.10以上版本 url 配置注意事项详解
Aug 05 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
Aug 26 Python
python读取与处理netcdf数据方式
Feb 14 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
Python常用模块函数代码汇总解析
Aug 31 Python
Python Spyder 调出缩进对齐线的操作
Feb 26 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 5.5 新特性
2013/07/02 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
js实现表单检测及表单提示的方法
2015/08/14 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
python实现的阳历转阴历(农历)算法
2014/04/25 Python
Python Deque 模块使用详解
2014/07/04 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
解决Django Static内容不能加载显示的问题
2019/07/28 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
Python下利用BeautifulSoup解析HTML的实现
2020/01/17 Python
基于Python组装jmx并调用JMeter实现压力测试
2020/11/03 Python
深入解析HTML5 Canvas控制图形矩阵变换的方法
2016/03/24 HTML / CSS
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
Java如何获得ResultSet的总行数
2016/09/03 面试题
入党自我评价优缺点
2014/01/25 职场文书
专业求职信撰写要诀
2014/02/18 职场文书
后勤部经理岗位职责
2014/02/23 职场文书
群众路线党课主持词
2014/04/01 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
优秀员工推荐材料
2014/12/20 职场文书
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android
详细了解MVC+proxy
2021/07/09 Java/Android
JVM的类加载器和双亲委派模式你了解吗
2022/03/13 Java/Android
Springboot中如何自动转JSON输出
2022/06/16 Java/Android