python自定义封装带颜色的logging模块

python 自定义封装带颜色的logging模块

自己在搭建python接口自动化框架 分享一些内容过程中想自己封装一个logger方法 根据logging进行二次封装 代码如下

import logging
import os
import time
import colorlog
from logging.handlers import RotatingFileHandler
# 创建文件目录
cur_path = os.path.dirname(os.path.realpath(__file__))  # log_path是存放日志的路径
log_path = os.path.join(os.path.dirname(cur_path), 'logs')
if not os.path.exists(log_path): os.mkdir(log_path)  # 如果不存在这个logs文件夹,就自动创建一个
# 修改log保存位置
timestamp = time.strftime("%Y-%m-%d", time.localtime())
logfile_name = '%s.log' % timestamp
logfile_path = os.path.join(log_path, logfile_name)
# 定义不同日志等级颜色
log_colors_config = {
   'DEBUG': 'bold_cyan',
   'INFO': 'bold_green',
   'WARNING': 'bold_yellow',
   'ERROR': 'bold_red',
   'CRITICAL': 'red',
}

class Logger(logging.Logger):
   def __init__(self, name, level='DEBUG', file=None, encoding='utf-8'):
       super().__init__(name)
       self.encoding = encoding
       self.file = file
       self.level = level
       # 针对所需要的日志信息 手动调整颜色
       formatter = colorlog.ColoredFormatter(
           '%(log_color)s%(levelname)1.1s %(asctime)s %(reset)s| %(message_log_color)s%(levelname)-8s %(reset)s| %('
           'log_color)s[%(filename)s%(reset)s:%(log_color)s%(module)s%(reset)s:%(log_color)s%(funcName)s%('
           'reset)s:%(log_color)s%(''lineno)d] %(reset)s- %(white)s%(message)s',
           reset=True,
           log_colors=log_colors_config,
           secondary_log_colors={
               'message': {
                   'DEBUG': 'blue',
                   'INFO': 'blue',
                   'WARNING': 'blue',
                   'ERROR': 'red',
                   'CRITICAL': 'bold_red'
               }
           },
           style='%'
       )  # 日志输出格式
       # 创建一个FileHandler,用于写到本地
       rotatingFileHandler = logging.handlers.RotatingFileHandler(filename=logfile_path,
                                                                  maxBytes=1024 * 1024 * 50,
                                                                  backupCount=5)
       rotatingFileHandler.setFormatter(formatter)
       rotatingFileHandler.setLevel(logging.DEBUG)
       self.addHandler(rotatingFileHandler)
       # 创建一个StreamHandler,用于输出到控制台
       console = colorlog.StreamHandler()
       console.setLevel(logging.DEBUG)
       console.setFormatter(formatter)
       self.addHandler(console)
       self.setLevel(logging.DEBUG)

logger = Logger(name=logfile_path, file=logfile_path)

使用时我们只需要引入封装好的类就行 直观美丽大方~

# 引入封装好的logger模块
from common.logger_handler import logger

def physical_strength(self, abnormal):
  """兑换体力异常通用方法"""
  if self.attrs.__contains__('costType'):
      attrs_Type = {
          "costType": abnormal,
          "count": self.attrs["count"]
      }
      response_Type = r().response(self.send_uid, self.code, self.event, attrs_Type)
      # 使用时直接调用logger.info()就行
      logger.info(f"physical_strength_{abnormal},response_Type:{response_Type}")
      assert response_Type["code"] != 0
      time.sleep(2)
      attrs_count = {
          "costType": self.attrs["costType"],
          "count": abnormal
      }
      response_count = r().response(self.send_uid, self.code, self.event, attrs_count)
      logger.info(f"physical_strength_{abnormal},response_count:{response_count}")
      assert response_count["code"] != 0
      time.sleep(2)
      attrs_all = {
          "costType": abnormal,
          "count": abnormal
      }
      response_all = r().response(self.send_uid, self.code, self.event, attrs_all)
      logger.info(f"physical_strength_{abnormal},response_all:{response_all}")
      assert response_all["code"] != 0
      time.sleep(2)
  else:
      attrs_count = {
          "count": abnormal
      }
      response_count = r().response(self.send_uid, self.code, self.event, attrs_count)
      logger.info(f"physical_strength_{abnormal},response_count:{response_count}")
      assert response_count["code"] != 0
      time.sleep(2)

效果:按照 日期/时间/日志等级/文件名称/类/方法名称/代码行数展示(这里可以自己手动调整formatter参数 如果感觉展示太长的话)
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息

避坑:不要用这种方式去调用日志等级方法 会出现日志打印定位路径错误 只能定位在log封装类当前方法下

  def debug(self, message):
      self.__console('debug', message)

  def info(self, message):
      self.__console('info', message)

  def warning(self, message):
      self.__console('warning', message)

  def error(self, message):
      self.__console('error', message)

到此这篇关于python自定义封装带颜色的logging模块的文章就介绍到这了,更多相关python logging模块内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python logging简介详解

    目录 一.日志级别 1. 级别定义 2. 简单示例 3. 指定级别 二.基本概念 1. Logger 2. Handler 3. Formatter 三.示例 1. 日志输出至控制台 2. 日志输出至文件 四.默认Logger 总结 一.日志级别 1. 级别定义 ​ logging模块提供了5种日志级别,分别为:CRITICAL>ERROR>WARNING>INFO>DEBUG.这些级别具有不同的优先级,其中CRITICAL的优先级最高,而DEBUG的优先级最低.具体来说 debu

  • Python的logging模块基本用法

    在服务器部署时,往往都是在后台运行.当程序发生特定的错误时,我希望能够在日志中查询.因此这里熟悉以下 logging 模块的用法. logging 模块定义了报告错误和状态信息的标准 API. logging 的组件 日志系统有 4 个相互交互的组件.我们需要使用 Logger 实例来向日志添加信息.触发日志会创建一个 LogRecord,用于内存中存储信息.Logger 可能有很多 Handler 对象,用于接收和处理日志记录.Handler 使用 Formatter 来输出日志记录. 向文件

  • 详解 python logging日志模块

    目录 1.日志简介 2.日志级别 3.修改日志级别 4.日志记录到文件 5.指定日志格式 6.记录器(logger) 7.处理器(Handler) 8.处理器操作 9.格式器(formatter) 10.logging.basicConfig 11.日志配置 转自微信公众号: Python之禅 1.日志简介 说到日志,无论是写框架代码还是业务代码,都离不开日志的记录,他能给我们定位问题带来极大的帮助. 记录日志最简单的方法就是在你想要记录的地方加上一句 print , 我相信无论是新手还是老鸟都

  • Python基础之logging模块知识总结

    前言 logging模块是Python内置的标准模块,主要用于输出脚本运行日志,可以设置输出日志的等级.日志保存路径等. 可以通过设置不同的日志等级,在 release 版本中只输出重要信息,而不显示大量的调试信息 logging 可以决定将信息输出位置和内容 logging 线程更安全 一.日志级别 级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG debug : 打印全部日志,详细信息,通常只出现在诊断问题 info : 打印info

  • python自定义封装带颜色的logging模块

    python 自定义封装带颜色的logging模块 自己在搭建python接口自动化框架 分享一些内容过程中想自己封装一个logger方法 根据logging进行二次封装 代码如下 import logging import os import time import colorlog from logging.handlers import RotatingFileHandler # 创建文件目录 cur_path = os.path.dirname(os.path.realpath(__fi

  • Python Django 封装分页成通用的模块详解

    这篇文章主要介绍了Python Django 封装分页成通用的模块详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 新建 utils 文件夹,并创建 page.py page.py: class ShowPage(object): def __init__(self, page_num, total_count, url_prefix, per_page=10, max_page=11): ''' :param page_num: 当前页码数

  • python中使用sys模板和logging模块获取行号和函数名的方法

    对于python,这几天一直有两个问题在困扰我:1.python中没办法直接取得当前的行号和函数名.这是有人在论坛里提出的问题,底下一群人只是在猜测python为什么不像__file__一样提供__line__和__func__,但是却最终也没有找到解决方案.2.如果一个函数在不知道自己名字的情况下,怎么才能递归调用自己.这是我一个同事问我的,其实也是获取函数名,但是当时也是回答不出来. 但是今晚!所有的问题都有了答案.一切还要从我用python的logging模块说起,logging中的for

  • python使用logging模块发送邮件代码示例

    logging模块不只是能记录log,还能发送邮件,使用起来非常简单方便 #coding=utf-8 ''''' Created on 2016-3-21 @author: Administrator ''' import logging, logging.handlers class EncodingFormatter(logging.Formatter): def __init__(self, fmt, datefmt=None, encoding=None): logging.Format

  • 解读python logging模块的使用方法

    1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 1.可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息: 2.print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据:logging则可以由开发者决定将信息输出到什么地方,以及怎么输出: logging框架中主要由四个部分组成: Loggers: 可供

  • python将logging模块封装成单独模块并实现动态切换Level方式

    查找了很多资料,但网上给出的教程都是大同小异的,而我想将代码进一步精简,解耦,想实现如下两个目标 1. 将logging模块的初始化,配置,设置等代码封装到一个模块中: 2. 能根据配置切换logging.level, 网上给出的教程都是写死的,如果我在线上之前使用了logging.info(msg),现在想切换为logging.debug(msg)怎么办?需要能够根据配置文件中的 设置配置logging.level 两个文件: logging_class:将logging模块的初始化,配置,设

  • python打印日志方法的使用教程(logging模块)

    目录 一.必备技能 1.logging模块的使用 二.logging 1.logging的基本使用 1.1.日志的五个等级(DEBUG/INFO/WARNING/ERROR/CRITICAL) 1.2.打印不同日志等级的方法: 2.自定义日志收集器 2.1.创建日志收集器 总结 一.必备技能 1.logging模块的使用 (1)5个日志等级/以及5个输出日志的内置函数 (2)日志收集器.日志输出渠道的概念 (3)如何自定义日志收集器 (4)如何封装自定义的日志收集器 二.logging pyth

  • python中日志logging模块的性能及多进程详解

    前言 Java 中最通用的日志模块莫过于 Log4j 了,在 python 中,也自带了 logging 模块,该模块的用法其实和 Log4j 类似.日志是记录操作的一种好方式.但是日志,基本都是基于文件的,也就是要写到磁盘上的.这时候,磁盘将会成为一个性能瓶颈.对于普通的服务器硬盘(机械磁盘,非固态硬盘),Python日志的性能瓶颈是多少呢?今天我们就来测一下.下面话不多说,来一起看看详细的介绍: 测试代码如下: #! /usr/bin/env python #coding=utf-8 # =

  • python logging模块的使用总结

    日志级别 CRITICAL 50 ERROR 40 WARNING 30 INFO 20 DEBUG 10 logging.basicConfig()函数中的具体参数含义 filename:指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中: filemode:文件打开方式,在指定了filename时使用这个参数,默认值为"w"还可指定为"a": format:指定handler使用的日志显示格式: datefmt:指定日期时间格式.,格式参考

  • python中logging模块的一些简单用法的使用

    用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这时候print就不大方便了,所以Python引入了logging模块来记录我想要的信息. print也可以输入日志,logging相对print来说更好控制输出在哪个地方,怎么输出及控制消息级别来过滤掉那些不需要的信息. 1.日志级别 import logging # 引入logging模块 # 将信息打印到控制台上 loggi

随机推荐