Python系列:彩色日志详解

news2024/10/6 22:23:53


前言

在使用Python进行编程时,我相信很多小伙伴都有一个共通的习惯,就是不管在什么场景下,都会先使用print()将我们获取到的数据打印出来以此来确保自己的代码没有问题。虽说在pycharm中提供了DEBUG功能,但是还是有很多小伙伴用不来这个或者是不喜欢用,自身还是比较喜欢使用print()来进行打桩验证。

但是如果我们的Python代码中有很多需要打印出来的数据时,使用print答应出来的数据就会很多,看起来就比较麻烦,那么有什么方法来解决这个问题呢?

别着急,接着往下看。Python中提供了很多丰富多彩的标准库和支持大量的第三方库,在本篇文章中,我们就会使用到coloredlogs

coloredlogs介绍

coloredlogs是一个Python库,它允许开发人员在控制台打印彩色日志。这个库的主要优点是它可以很容易地改变日志消息的颜色,从而使日志更易于阅读和理解。这对于长时间运行的应用程序或者需要详细查看日志信息的情况非常有用。

coloredlogs库的使用

1.安装coloredlogs

在使用前我们需要在Python中下载它

pip install coloredlogs

2.设置logger日志级别

首先,在我们记录日志时,需要先设置日志级别和格式

coloredlogs.install(level='DEBUG', fmt='%(asctime)s %(levelname)s %(message)s')

3.自定义输出样式

如果我们不结合coloredlogs直接将我们的日志打印到控制台

logging.debug('debug message')
logging.info('info message')
logging.error('error message')
logging.warning('warning message')

输出到控制的话就只会将error和warning两个级别的日志在控制打印出来,debug和info级别的日志就无法在控制台打印出来,而且显示的两种日志都是一样的颜色并且格式也不好看

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

下面是在我们结合使用coloredlogs后在控制台的输出效果

import coloredlogs
import logging

coloredlogs.install(level='DEBUG', fmt='%(asctime)s %(levelname)s %(message)s')

logging.debug('debug message')
logging.info('info message')
logging.error('error message')
logging.warning('warning message')

输出效果如下

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

可以很明显的看出,它自动帮我们加上了日志的输出时间和根据不同日志级别显示不一样的颜色来区分,这比我们直接用logging输出要好得多

4.自定义输出格式

我们可以在之前添加的输出格式中添加其他的格式内容

import coloredlogs
import logging

def func_name():
    # 增加了modules、funcName两个变量,分辨标识我们日志所在文件以及在哪一个函数中输入的日志
    coloredlogs.install(level='DEBUG', fmt='%(asctime)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s')

    logging.debug('debug message')
    logging.info('info message')
    logging.error('error message')
    logging.warning('warning message')


func_name()

输出结果如下

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

我们增加了两个变量后,可以方便我们后续寻找问题时就直接定位到了那个文件中的哪个函数出了问题,这是不是就方便我们后面解决问题的效率。

5.自定义日志级别输出样式

再上面我们是直接使用了coloredlogs中的默认日志级别颜色样式,同样的我们也可以自定义设置不同日志的显示的样色样式

import coloredlogs
import logging


def fun_name():
    level_styles = coloredlogs.DEFAULT_LEVEL_STYLES.copy()
    level_styles['debug'] = {'color': 'magenta'}
    level_styles['info'] = {'color': 'yellow'}
    level_styles['error'] = {'color': 'red'}
    level_styles['warning'] = {'color': 'blue'}
    coloredlogs.install(level="DEBUG", level_styles=level_styles,
                        fmt='%(asctime)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s')

    logging.debug('debug message')
    logging.info('info message')
    logging.error('error message')
    logging.warning('warning message')


fun_name()

输入样式如下

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

6.写入到日志文件

上面我们说的是将日志打印到控制台中,但是我们Python代码写完并且在运行当中后,我们就不可能这样玩了,所以我们需要将日志保存到一个日志文件中

完整代码如下:

import coloredlogs
import logging


def func_name():
    # 创建文件handler
    file_handler = logging.FileHandler('log_file.log')

    # 设置日志格式
    formatter = logging.Formatter('%(asctime)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s')
    file_handler.setFormatter(formatter)

    # 安装coloredlogs并设置级别
    level_styles = coloredlogs.DEFAULT_LEVEL_STYLES.copy()
    coloredlogs.install(level="DEBUG", level_styles=level_styles,
                        fmt='%(asctime)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s')

    # 获取logger 并添加文件handler
    logger = logging.getLogger()
    logger.addHandler(file_handler)

    # 移除默认StreamHandler
    logger.removeHandler(logging.StreamHandler())

    # 测试输出日志
    logger.debug('debug message')
    logger.info('info message')
    logger.error('error message')
    logger.warning('warning message')


func_name()

打开我们log_file.log文件后,就可以看到我们生成的日志信息

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

可以看到我们生成的日志文件中不同级别的日志还是使用的是一样的颜色。那这是为什么呢?

其实coloredlogs 库只是在终端输出时给日志添加了颜色,但写入文件时colors并不能保留。

这是因为终端输出和文件输出使用的是不同的handler:

  • 终端输出使用的是StreamHandler,可以 interpreter 处理ANSI色彩编码显示颜色。

  • 文件输出使用的是FileHandler,写入的仅是纯文本,无法保存ANSI编码的颜色信息。

ANSI色彩编码只有在支持其的终端才能渲染为颜色,一旦写入文件就会失去这些编码信息。所以使用coloredlogs时,日志文件内实际保存的是未着色的原始文本。

如果想要文件中也保存颜色信息,可以考虑使用支持ANSI色彩的文件格式,比如HTML。然后通过logging模块支持的HTML Formatter输出彩色日志到HTML文件中,不过这种情况下就失去了纯文本文件的可阅读性。
综上,coloredlogs只是在终端美化日志展示效果,文件输出不保存颜色是正常情况。如果必须存储颜色,可以输出为HTML等格式,但复杂度会增加。

如果有小伙伴对写入到html文件感兴趣的,这里我提供我写的一份代码,你们可以拿去自行研究哈~~

import coloredlogs
import logging
from logutils.colorize import ColorizingStreamHandler
import sys

def func_name():
    # 创建一个ColorizingStreamHandler
    color_handler = ColorizingStreamHandler(sys.stdout)
    color_handler.setLevel(logging.DEBUG)

    # 设置格式器
    html_formatter = logging.Formatter('<p>%(asctime)s - %(name)s - %(levelname)s - %(message)s</p>')
    color_handler.setFormatter(html_formatter)

    # 安装coloredlogs
    coloredlogs.install(level='DEBUG',fmt='%(asctime)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s')

    # 获取logger并添加handler
    logger = logging.getLogger()
    logger.addHandler(color_handler)

    # 日志输出
    logger.debug('debug message')
    logger.info('info message')
    logger.error('error message')
    logger.warning('warning message')

    # 重定向输出到文件
    with open('log_file.log.html', 'w') as f:
        old_stdout = sys.stdout
        sys.stdout = f
        logger.debug('debug message')
        logger.info('info message')
        logger.error('error message')
        logger.warning('warning message')
        sys.stdout = old_stdout

    # 关闭默认StreamHandler
    logger.removeHandler(logging.StreamHandler())

func_name()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1084279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你知道期权和期货有什么关联和区别吗?解析一下!

随着金融市场的不断发展&#xff0c;期权和期货成为了两种常见的金融衍生品&#xff0c;它们都具有规避风险和发现价格的功能。很多入门不知道期权和期货哪个更好&#xff0c;下文科普你知道期权和期货有什么关联和区别吗&#xff1f;解析一下&#xff01;本文来源&#xff1a;…

AI Web3 盛会「EDGE」在港闭幕,融云国际影响力持续提升

&#x1f446;点击报名「爱嗨游」线上发布会 9 月 25 日至 27 日&#xff0c;全球规模最大的 AI & Web3 投资盛会——EDGE 峰会在中国香港举办&#xff0c;融云作为战略合作伙伴与来自世界各地的企业家、投资人、学者和热门项目方一同完成了这一盛会。关注【融云全球互联网…

虾皮商品评论数据接口,shopee商品评论API接口,虾皮API接口

虾皮商品评论数据接口的申请步骤如下&#xff1a; 在开放平台注册账号&#xff0c;申请API调用权限。登录开放平台&#xff0c;进入API管理界面&#xff0c;在接口列表中找到“商品详情”API接口&#xff0c;点击“申请使用”。填写API申请表格&#xff0c;包括API调用用途、申…

边端小场景音视频流分发架构

备注&#xff1a;绿色线条&#xff0c;红色线条&#xff0c;蓝色线条&#xff0c;均是表示同一路流的不同的协议而已 1&#xff09;IPC本身的流媒体的能力有限&#xff0c;一般IPC支持的客户端数10~50个&#xff0c;媒体分发能力&#xff1a;10~20路&#xff0c;看设备品牌能力…

AQS简介

AQS 简介 AQS&#xff08;AbstractQueuedSynchronizer&#xff09;是Java中用于实现同步器的抽象基类。它提供了一种灵活的方式来创建自定义的同步器&#xff0c;如锁、信号量等。AQS的底层包含了一些重要的成员变量&#xff0c;其中最重要的是state&#xff0c;用于表示同步…

2.连接Cesium Ion

1.登录Cesium 打开菜单上的 Cesium->Cesium. 点击 Connect To Cesium ion,进入网站进行登录以及授权。 2.创建Token 点击Token按钮&#xff0c;弹出Token选择界面&#xff0c;如果没有Token则创建一个&#xff0c;有的话可以直接进行选择。至此&#xff0c;我们可以在Unity中…

【electron】手把手教你在 electron 环境下使用 vue-devtools,附详细报错解决办法

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ vue-devtools问题来源解决思路 2️⃣ 屏蔽electron-devtools-installer加载的代码3️⃣ 加载本地vue-devtools插件代码实现electron加载本地插件获取vue-devtools&#xff1a;【推荐】Edge下载最新插件获取vue-devtools&#xff1…

Linux Shell 实现一键部署vmtools

VMware Tools 简介 VMware Tools 中包含一系列服务和模块&#xff0c;可在 VMware 产品中实现多种功能&#xff0c;从而使用户能够更好地管理客户机操作系统&#xff0c;以及与客户机操作系统进行无缝交互。 VMware Tools 具备以下功能&#xff1a; 将消息从主机操作系统传递…

2023年中国家用照明市场发展趋势分析:家用照明市场中智能产品提升显著[图]

2016-2019年我国家用照明行业迎来初步快速发展&#xff0c;2020-2021年受疫情影响增速稍微放缓&#xff0c;2022年&#xff0c;我国家用照明行业规模为362.8亿元&#xff0c;同比增长0.58%&#xff1b;预计2023年家用照明行业表现将有明显反弹&#xff0c;市场规模将达413亿元&…

DW网页作业成品下载后导入Dreamweaver如何新建站点及导出站点

很多学生下载了HTMLhttps://blog.csdn.net/qq_41101110?spm1011.2415.3001.5343后&#xff0c;想自己进行修改图文或者文字内容&#xff0c;或者修改网页文件名称。对于基础较差的同学&#xff0c;使用Dreamweaver新建站点导入作品后再修改&#xff0c;就更简单些了。 新建站…

【深度学习】MNIST手写数字数据集的分类识别

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

使用docker安装db2

使用docker安装db2 1. 前言1.1 关于docker的安装1.2 安装db2版本选择参考 2. 拉取镜像3. 启动镜像4. 进入容器&#xff0c;切换用户4.1 进入容器4.2 切换用户4.3 其他命令 5. 可视化工具DBeaver连接db25.1 连接5.2 简单使用 1. 前言 1.1 关于docker的安装 关于Linux上docker的…

一些常用的兼容性测试方法和技巧

兼容性测试是软件开发过程中的重要环节&#xff0c;但如何进行有效的兼容性测试是一个需要关注的问题。下面将介绍一些常用的兼容性测试方法和技巧。 首先&#xff0c;要确定兼容性测试的范围。根据软件的特点和用户的需求&#xff0c;确定需要测试的操作系统、浏览器、分辨率…

【vue3】实现数据响应式(ref、shallowRef、trigger、reactive、shallowReactive、toRef、toRefs)

一、ref、shallowRef、trigger ref支持所有类型 可以粗略理解为 ref shallowRef triggerRef 1、通过ref获取dom元素 <p ref"_ref">这是ref获取dom元素</p>import {ref,shallowRef, triggerRef} from vueconst _ref ref()console.log(_ref.value?.i…

【Linux】提权问题

目录 一、设置白名单 一、设置白名单 当我们在使用sodo的时候&#xff0c;会发现我们的普通用户是无法用这个指令的&#xff0c;这个是因为这个普通用户还没有在root下是白名单里的用户 接下来我们来看一下怎样设置白名单用户 在root下打开配置文件vim /etc/sudoers 找到第100…

[硬件基础]-555定时器-非稳态多谐振荡器配置

555定时器-非稳态多谐振荡器配置 文章目录 555定时器-非稳态多谐振荡器配置1、概述2、非稳态多谐振荡器的内部工作原理 我们已经在之前的文章中介绍了 555 定时器的单稳态和双稳态操作。 在本文中&#xff0c;我们将讨论第三种配置 - 555 定时器的非稳定模式。 我们将了解如何在…

Apache atlas 元数据管理治理平台使用和架构

1、前言 Apache Atlas 是托管于 Apache 旗下的一款元数据管理和治理的产品&#xff0c;目前在大数据领域应用颇为广泛&#xff0c;可以很好的帮助企业管理数据资产&#xff0c;并对这些资产进行分类和治理&#xff0c;为数据分析&#xff0c;数据治理提供高质量的元数据信息。…

远控项目02:项目的创建以及git的配置

&#x1f482; 个人主页:pp不会算法v &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 c/MFC远程控制项目系列文章 1、在github创建仓库 2、在本地创建一个空文…

Vue-2.3v-model原理

原理&#xff1a;v-model本质上是一个语法糖&#xff0c;例如应用在输入框上&#xff0c;就是value属性和input事件的合写。 作用&#xff1a;提供数据的双向绑定 1&#xff09;数据变&#xff0c;视图跟着变:value 2&#xff09;视图变&#xff0c;数据跟着变input 注意&a…

PostMan环境变量、全局变量、动态参数使用

一、环境准备 postmanmoco [{"description": "登录认证","request": {"uri": "/login","method": "post","forms": {"user": "admin","password": "a123…