【python】输出高亮信息的内容

news2024/11/25 2:35:07

背景

日志是定位问题和数据分析的关键手段之一,尤其是在调试阶段,高效的、具有辨识度的日志可以非常快速准确的进行问题定位。shell中的echo命令自带文本格式化输出的功能,我们先来回顾下基本的语法,然后套用到python中即可。

shell高亮输出

参考链接:http://www.taodudu.cc/news/show-6319976.html?action=onClick

  • 语法:linux系统可以通过man echo来查看

echo命令语法:echo [-ne][字符串] / echo [–help][–version]

支持的可选参数如下:

   -n     :内容输出完毕后不在末尾加换行
   -e    打开反斜杠ESC转义。若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
       \\    \字符
       \a      发出警告声
       \b     退格键,也就是删除前一个字符
       \c    最后不加上换行符号
       \e     esc
       \f    换行但光标仍旧停留在原来的位置
       \n    换行且光标移至行首
       \r    光标移至行首,但不换行
       \t    插入tab
       \0NNN  插入nnn(八进制)所代表的ASCII字符
       \xHH    插入hh(十六进制)所代表的ASCII字符
   -E    :取消反斜杠ESC转义 (默认)
   --help:输出帮助信息
   --version: 输出版本信息
  • echo输出带颜色的文字示例
echo -e "\033[30m 黑色字\033[0m"
echo -e "\033[31m 红色字\033[0m"
echo -e "\033[32m 绿色字\033[0m"
echo -e "\033[33m 黄色字\033[0m"
echo -e "\033[34m 蓝色字\033[0m"
echo -e "\033[35m 紫色字\033[0m"
echo -e "\033[36m 天蓝色字\033[0m"
echo -e "\033[37m 白色字\033[0m"
#组合设置文本,用分号隔开:白色背景、加粗的绿色字体
echo -e "\033[47;1;32m 绿色字\033[0m"
#也可以使用16进制,esc键对于的ascii码:27(10进制)、0o33(8进制)、0x1b(16进制)
echo -e "\x1b[47;1;32m 绿色字\x1b[0m"

执行结果:
在这里插入图片描述

  • 【说明】
    1、输出带有颜色的文本,必须有"-e"选项,用来启动反斜杠转义的功能;
    2、支持的编码如下所示(这些颜色是ANSI标准颜色):
    编码 颜色/动作
    0   重新设置属性到缺省设置
    1   设置粗体
    2   设置一半亮度(模拟彩色显示器的颜色)
    4   设置下划线(模拟彩色显示器的颜色)
    5   设置闪烁
    7   设置反向图象
    22   设置一般密度
    24   关闭下划线
    25   关闭闪烁
    27   关闭反向图象
    30   设置黑色前景
    31   设置红色前景
    32   设置绿色前景
    33   设置黄色前景
    34   设置蓝色前景
    35   设置紫色前景
    36   设置青色前景
    37   设置白色(灰色)前景
    38   在缺省的前景颜色上设置下划线
    39   在缺省的前景颜色上关闭下划线
    40   设置黑色背景
    41   设置红色背景
    42   设置绿色背景
    43   设置黄色背景
    44   设置蓝色背景
    45   设置紫色背景
    46   设置青色背景
    47   设置白色(灰色)背景
    49   设置缺省黑色背景
    3、"\033"代表的是键ASCII码的8进制;代表着终端转义字符开始,“m"意味着设置属性然后结束非常规字符序列,
    4个例子里真正有效的字符是"47;1;32"和"0”。修改"47;1;32"可以生成不同颜色的组合,数值和编码的前后顺序可以任意指定;

python高亮输出

对应到python代码的话,照猫画虎就大公告成了。

# @Time : 2023/8/27 10:22 
# @Author : xiaoxiao
# @File : log.py
"""
基于logging模块的日志工具类
"""
import sys
import logging
import datetime
import inspect
import os


class Logger:
    """log工具类"""
    def __init__(self):
        self._log_file = "./log.log"
        self._logger = logging.getLogger("poc")
        self._logger.setLevel(logging.DEBUG)
        # self._logger.handlers = []
        file_handler = logging.FileHandler(self._log_file)
        file_handler.setFormatter(logging.Formatter("%(message)s"))
        self._logger.addHandler(hdlr=file_handler)
        if "--quiet" in sys.argv or "-q" in sys.argv:
            return
        stream_handler = logging.StreamHandler(sys.stdout)
        stream_handler.setFormatter(logging.Formatter("%(message)s"))
        self._logger.addHandler(hdlr=stream_handler)
        # self._logger.propagate = False

    def _format_message(self, level, message):
        """格式化将要输出日志信息

        :param level: str, 日志等级, INFO/WARN/ERROR/HIGHLIGHT
        :param message: str, 日志信息条目
        :return: str, 格式化的日志信息条目
        """
        frame = inspect.currentframe().f_back.f_back
        frame_info = inspect.getframeinfo(frame)
        line_no = frame_info.lineno
        file_name = frame_info.filename
        module_name = os.path.splitext(os.path.split(file_name)[1])[0]
        if module_name and line_no:
            message = "{time} - [{module}#{line}] - {level} - {message}".format(
                time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S,%f')[:-3],
                module=module_name, line=line_no, level=level, message=message)
        return message

    def info(self, message):
        self._logger.info(self._format_message("INFO", message))

    def warn(self, message):
        self._logger.warning(self._format_message("WARN", message))

    def error(self, message):
        self._logger.error(self._format_message("ERROR", message))

    def highlight_red(self, message):
        self._logger.info(self._format_message("HIGHLIGHT", "\033[31;1m{}\033[0m".format(message)))

    def highlight_green(self, message):
        self._logger.info(self._format_message("HIGHLIGHT", "\033[32;1m{}\033[0m".format(message)))

    def highlight_yellow(self, message):
        self._logger.info(self._format_message("HIGHLIGHT", "\033[33;1m{}\033[0m".format(message)))


if __name__ == "__main__":
    logger = Logger()
    logger.highlight_red("前方高能预警")
    logger.highlight_green("放宽心,一切正常")
    logger.highlight_yellow("注意,可能出现异常")

执行结果:
在这里插入图片描述

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

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

相关文章

【kubernetes】使用kubepshere部署中间件服务

KubeSphere部署中间件服务 入门使用KubeSphere部署单机版MySQL、Redis、RabbitMQ 记录一下搭建过程 (内容学习于尚硅谷云原生课程) 环境准备 VMware虚拟机k8s集群,一主两从,master也作为工作节点;KubeSphere k8skubesphere devops比较占用磁…

手写数字识别之优化算法:观察Loss下降的情况判断合理的学习率

目录 手写数字识别之优化算法:观察Loss下降的情况判断合理的学习率 前提条件 设置学习率 学习率的主流优化算法 手写数字识别之优化算法:观察Loss下降的情况判断合理的学习率 我们明确了分类任务的损失函数(优化目标)的相关概念和实现方法&#xff…

Torrent Scanner插件导致网站重复登录

Torrent Scanner插件导致网站重复登录 网站登录成功后随便点击任意按钮,又重复跳回登录页面,可能原因是cookie的问题,不过博主遇到的是Torrent Scanner插件导致重复登录,解决方法:直接卸载或停止Torrent Scanner插件。…

C++贪吃蛇(控制台版)

C自学精简实践教程 目录(必读) 目录 主要考察 需求 输入文件 运行效果 实现思路 枚举类型 enum class 启动代码 输入文件data.txt 的内容 参考答案 学生实现的效果 主要考察 模块划分 文本文件读取 UI与业务分离 控制台交互 数据抽象 需求 用户输入字母表示方…

【leetcode 力扣刷题】双指针///原地扩充线性表

双指针///原地扩充线性表 剑指 Offer 05. 替换空格定义一个新字符串扩充字符串,原地替换思考 剑指 Offer 05. 替换空格 题目链接:剑指 Offer 05. 替换空格 题目内容: 这是一道简单题,理解题意,就是将字符串s中的空格…

windows系统依赖环境一键安装

window系统程序依赖库,可以联系我获取15958139685 脚本代码如下,写到1. bat文件中,双击直接运行,等待安装完成即可 Scku.exe -AVC.exe /SILENT /COMPONENTS"icons,ext\reg\shellhere,assoc,assoc_sh" /dir%1\VC

性能优化为什么那么重要

性能优化在计算机系统和软件开发中具有重要意义,是衡量工程师技术水平的试金石,是升职加薪必备技能,并且在各个技术领域都发挥举足轻重的作用。 嵌入式领域 嵌入式设备通常具有有限的硬件资源(如 CPU、内存、存储空间等&#xff0…

命令行环境

sleep 20 延迟20秒 这个是操作系统的信号机制 ctrl z ^z可以恢复 jobs 可以查看 终端运行工作列表,bg可以将暂停的作业重新运行 通过kill暂停作业 通过 -KILL 之后才可以将 -HUP 作业悬挂起来 终端复路多用 会话 ^a p 上一个会话 ^ a n 下一个会话 别名 左右不能…

idea中创建springboot项目显示Spring Initializr Error

很长时间不创建springboot项目了,今天发现创建完成idea显示: Spring Initializr Error error:status:500项目中没有pom.xml文件.检查了一下原因是在创建的时候类型没有创建正确(之前记得都是默认),默认如下 需要选择创建maven完整工程那种,最下面那种只会生成pom.xml不会…

javaee spring 自动注入,如果满足条件的类有多个如何区别

如图IDrinkDao有两个实现类 方法一 方法二 Resource(name“对象名”) Resource(name"oracleDrinkDao") private IDrinkDao drinkDao;

《Java极简设计模式》第05章:原型模式(Prototype)

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 源码地址:https://github.com/binghe001/java-simple-design-patterns/tree/master/j…

Unittest自动化测试框架vs Pytest自动化测试框架

引言 前面一篇文章Python单元测试框架介绍已经介绍了python单元测试框架,大家平时经常使用的是unittest,因为它比较基础,并且可以进行二次开发,如果你的开发水平很高,集成开发自动化测试平台也是可以的。而这篇文章主要…

Pico使用C/C++选择使用哪个I2C控制器,以及SDA和SCL针脚

本文一开始讲述了解决方案,后面是我做的笔记,用来讲述我的发现流程和探究的 Pico I2C 代码结构。 前提知识 首先要说明一点:Pico 有两个 I2C,也就是两套 SDA 和 SCL。这点你可以在针脚图中名字看出,比如下图的 Pin 4…

性能测试面试问题,一周拿3个offer不嫌多

性能测试的三个核心原理是什么? 1.基于协议。性能测试的对象是网络分布式架构的软件,而网络分布式架构的核心是网络协议 2.多线程。人的大脑是单线程的,电脑的cpu是多线程的。性能测试就是利用多线程的技术模拟多用户去负载 3.模拟真实场景。…

<C++> STL_容器适配器

1.容器适配器 适配器是一种设计模式,该种模式是将一个类的接口转换成客户希望的另外一个接口。 容器适配器是STL中的一种重要组件,用于提供不同的数据结构接口,以满足特定的需求和限制。容器适配器是基于其他STL容器构建的,通过…

关于类的隐形生成函数

https://www.youtube.com/watch?ve8Cw17p_BiU&listPL5jc9xFGsL8FWtnZBeTqZBbniyw0uHyaH&index6 https://www.youtube.com/watch?vKMSYmY74AEs&listPLE28375D4AC946CC3&index4 如果只有copy asignment operator, 那么default construct will be generated as…

复习之docker部署--项目实战

一、实验环境 1.安装7.6虚拟机 最小化安装,不安装图形! 2.封装虚拟机 关闭selinux关闭防火墙关闭networkmanager配置网络,保证可以ssh修改主机名添加双向解析配置7.6网络仓库--安装常用的工具 配置完成后,在真机ssh虚拟机 如果…

webassembly003 GGML Tensor Library part-1

GGML ggml的函数 可以看到官方示例项目仅依赖于#include "ggml/ggml.h", #include "common.h",可以阅读ggml.h获取ggml的使用帮助 函数解释注释ggml_tensor多维张量按行主顺序存储。ggml_tensor结构包含每个维度中元素数&#xf…

哈夫曼编码(C++实现)

文章目录 1. 前言2. 固定长度编码3. 哈夫曼编码4. 哈夫曼解码5. 编码特点6. 代码实现7. 总结 1. 前言 在上一篇文章中,介绍了 哈夫曼树的概念及其实现 。 哈夫曼树有什么用途呢? —— 那就是用来创建哈夫曼编码(Huffman Coding —— 一种二…

2.神经网络的实现

创建神经网络类 import numpy # scipy.special包含S函数expit(x) import scipy.special # 打包模块 import pickle# 激活函数 def activation_func(x):return scipy.special.expit(x)# 用于创建、 训练和查询3层神经网络 class neuralNetwork:# 初始化神经网络def __init__(se…