Python学习之-logging模块及彩色日志详解

前言:

Python的logging模块是内建的、功能强大的日志系统,可通过简单的配置,就能满足基本到复杂的日志管理需求。它可以让你以各种方式记录错误、调试信息、以及其他运行时的信息,这些都是应用程序健壯性、可维护性的关键。

1 基础概念

在深入了解之前,先理解logging模块的几个基本概念:
Logger:应用程序代码直接使用的接口。
Handler:用于将日志记录(log record)发送到合适的目的地。
Formatter:用于配置日志信息的最终顺序、结构和内容。
Level:日志级别,如DEBUG、INFO、WARNING、ERROR、CRITICAL等,用于区分日志的重要性。
debug: 用于开发者调试,显示变量等详细信息; 正常版本不应包含
info: 通知用户关键的正常行为,如“主库添加成功”;用简单、明确的语言记录
warning:不正常或偏离预期的行为; 不会立即影响系统,但具有潜在风险
critical:未知的不正常行为,超出已知容错;可能会影响程序未来运行
error: 无法修复的严重错误;必须立即处理并可能需要停止程序。

1.1 简单的示例:

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/8
# @Author  : Summer
# @File    : logger.py
# @describe:
"""
import logging# 配置日志等级为INFO,日志格式等
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 获取logger对象
logger = logging.getLogger(__name__)# 记录不同等级的日志
logger.debug('This is a debug message.')
logger.info('This is an info message.')
logger.warning('This is a warning message.')
logger.error('This is an error message.')
logger.critical('This is a critical message.')

对于简单的脚本或小型项目,basicConfig方法的配置足够使用。但是,对于更复杂的日志需求,可能需要配置多个handler、formatter,并灵活地应用不同的日志级别。

2 彩色日志

logging模块默认不支持彩色日志。要实现彩色日志,可以自定义Formatter,在输出的文本中加入终端色彩代码。一个简单的方式是使用colorlog包,它是一个允许彩色配置输出的第三方库。
colorlog的使用

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/8
# @Author  : Summer
# @File    : logger.py
# @describe:
"""
import colorlog
import logging# 创建logger对象
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)# 创建handler
ch = logging.StreamHandler()# 创建带颜色的formatter
formatter = colorlog.ColoredFormatter("%(log_color)s%(levelname)-8s%(reset)s %(blue)s%(message)s",datefmt=None,reset=True,log_colors={'DEBUG':    'cyan','INFO':     'green','WARNING':  'yellow','ERROR':    'red','CRITICAL': 'red,bg_white',},secondary_log_colors={},style='%'
)# 设置handler的formatter
ch.setFormatter(formatter)# 将handler添加到logger中
logger.addHandler(ch)# 记录示例日志
logger.debug('Debug message')
logger.info('Info message')
logger.warning('Warning message')
logger.error('Error message')
logger.critical('Critical message')

在这里插入图片描述
在这里,ColoredFormatter允许指定日志级别的颜色,改善日志的可读性。上述例子在日志级别、消息文本周围加入了颜色。
这只是logging模块以及如何实现彩色日志输出的一个简介。根据不同的日志策略和复杂性,logging模块提供的灵活性和功能可以大大帮助提升应用程序的质量和可维护性。

3 完整代码

下面给大家提供一个完整的封装,希望对大家有用

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/8
# @Author  : Summer
# @File    : logger.py
# @describe:
"""
import logging
import os
import time# ANSI escape codes for colors in terminal
class TerminalColor:RED = '\033[91m'GREEN = '\033[92m'YELLOW = '\033[93m'RESET = '\033[0m'BLUE = '\033[94m'MAGENTA = '\033[95m'CYAN = '\033[96m'WHITE = '\033[97m'class ColorFormatter(logging.Formatter):COLORS = {logging.DEBUG: TerminalColor.CYAN,logging.INFO: TerminalColor.GREEN,logging.WARNING: TerminalColor.YELLOW,logging.ERROR: TerminalColor.RED,logging.CRITICAL: TerminalColor.RED + TerminalColor.WHITE}def format(self, record):level_color = self.COLORS.get(record.levelno)reset_color = TerminalColor.RESETmessage = super(ColorFormatter, self).format(record)return level_color + message + reset_colorlog_path = os.path.join(os.path.dirname(__file__), 'logs')
if not os.path.exists(log_path):os.mkdir(log_path)class Log(object):def __init__(self, log_name):self.log_name = log_nameself.logname = os.path.join(log_path, '%s_%s.log' % (self.log_name, time.strftime('%Y_%m_%d')))self.logger = logging.getLogger()self.logger.setLevel(logging.DEBUG)formatter = ColorFormatter('[%(asctime)s] - %(filename)s] - %(levelname)s: %(message)s')# Create file handlerfh = logging.FileHandler(self.logname, 'a', encoding='utf-8')fh.setLevel(logging.DEBUG)fh.setFormatter(formatter)# Create console handler with color supportch = logging.StreamHandler()ch.setLevel(logging.DEBUG)ch.setFormatter(formatter)self.logger.addHandler(fh)self.logger.addHandler(ch)def debug(self, message):self.logger.debug(message)def info(self, message):self.logger.info(message)def warning(self, message):self.logger.warning(message)def error(self, message):self.logger.error(message)def critical(self, message):self.logger.critical(message)if __name__ == "__main__":log = Log('Confluence')log.info("---测试开始----")log.info("操作步骤1,2,3")log.warning("----测试结束----")log.error("----测试中有错误----")log.critical("----测试中有致命错误----")

在这里插入图片描述
注意:日志颜色通常只在兼容ANSI颜色代码的终端内生效,而在日志文件中是不可见的。此外,某些操作系统或终端可能不支持或默认关闭了颜色输出,这就需要相应地配置环境或更换支持颜色的终端。

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

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

相关文章

分公司=-部门--组合模式

1.1 分公司不就是一部门吗? "我们公司最近接了一个项目,是为一家在全国许多城市都有分销机构的大公司做办公管理系统,总部有人力资源、财务、运营等部门。" "这是很常见的OA系统,需求分析好的话&#xff0…

CTK插件框架学习-服务工厂(06)

CTK插件框架学习-信号槽(05)https://mp.csdn.net/mp_blog/creation/editor/137240105 一、服务工厂定义 注册插件时使用服务工厂注册,使用getService根据调用者插件资源文件内容获取在服务工厂内的对应实现在服务工厂中可以知道是哪个插件正在调用服务工厂懒汉模式…

Day5-Hive的结构和优化、数据文件存储格式

Hive 窗口函数 案例 需求:连续三天登陆的用户数据 步骤: -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…

开源免费的多功能PDF工具箱

它支持修改PDF、编辑PDF书签、导出PDF书签、导入书签、生成、合并、拆分、提取页面内容、提取图片、OCR 功能介绍: 修改PDF信息:修改文档属性、页码编号、页面链接、页面尺寸;删除自动打开网页等动作,去除复制及打印限制;设置阅读…

别再抱怨学鸿蒙没方向了! 这鸿蒙全栈(南北双向)开发学习路线收藏好!

在互联网技术不断发展的现在,鸿蒙操作系统的出现标志着是能技术领域的一次重大突破,鸿蒙作为华为推出的一代操作系统,鸿蒙不仅达代表了自主创新的力量,还因为独特的分布式架构和全场景适配能力而备受关注。随着鸿蒙生态的不断完善…

2024.4.7周报

摘要 在本周阅读的文献中,提出了基于Transformer的GAN模型,GAN的生成器和鉴别器,都是基于Transformer的编码器架构构建的,通过处理图像的方式处理时间序列数据作为该模型的输入。该模型能够生成各种长度的多维时间序列数据&#…

7.1.4 Selenium 爬取京东商品信息实战

目录 1、实战内容 2、思路 3、分析 url 4、开始操作 1、得到 Cookies 2、访问页面,得到 response 3、解析页面 4、存入 MySQL 5、1-3步总代码 1、实战内容 爬取京东笔记本电脑商品的信息(如:价格、商品名、评论数量),存入 MySQL 中…

11-新热文章-实时计算

热点文章-实时计算 1 今日内容 1.1 定时计算与实时计算 1.2 今日内容 kafkaStream 什么是流式计算 kafkaStream概述 kafkaStream入门案例 Springboot集成kafkaStream 实时计算 用户行为发送消息 kafkaStream聚合处理消息 更新文章行为数量 替换热点文章数据 2 实时…

能源照明运作机制与智能调控技术实现途径

随着城市化进程的加速,智慧城市已成为现代城市发展的重要方向。能源照明作为城市基础设施的重要组成部分,其运作机制与智能调控技术的实现对于提高城市能源利用效率、促进可持续发展具有重要意义。 能源照明是一个涵盖广泛、错综复杂的领域,它…

Redis中的集群(一)

集群 概述 Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能 节点 一个Redis集群通常由多个节点(node)组成,在刚开始的时候,每个节点都是相互独立的,它们都…

【优选算法专栏】专题十六:BFS解决最短路问题(二)

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小…

奇函数+(-)偶函数一定是非奇非偶函数?

今天遇到个有意思的题,跟大家分享一下,可能有的人不太了解: 首先说下结论:这题选D选项,以上均有可能; 开始证明: 非奇非偶函数的充要条件: 定义域是(一a,a)(a>0)或(一 oo,oo)的…

【Linux】软硬链接 / 动静态库

目录 一. 软硬链接1. 硬链接2. 软链接3. unlink4. 目录的硬链接 二. 动静态库1.1 静态库制作1.2 静态库使用2.1 动态库制作2.2 动态库使用3. 动态链接原理 一. 软硬链接 1. 硬链接 硬链接(hard link) 可以将它理解为原始文件的别名, 和原始文件使用相同的 inode 编号和 data …

Mysql底层原理七:InnoDB 行记录

1.行格式 1.1 Compact行格式 1.1.1 示意图 1.1.2 准备一下 1)建表 mysql> CREATE TABLE record_format_demo (-> c1 VARCHAR(10),-> c2 VARCHAR(10) NOT NULL,-> c3 CHAR(10),-> c4 VARCHAR(10)-> ) CHARSETascii ROW_FORMATCOM…

Blender怎么样启动默认移动和Cavity效果

在使用Blender的过程中,有一些特殊的技巧很重要。 比如默认地设置blender打开时,就是移动物体,这样怎么样设置的呢? 需要在界面里打开下面的菜单: 这样就找到默认设置的地方,把下面的移动勾选起来,这样点…

3.C++ Make

1.Makefile 1.1 什么是 Makefile 一个工程中有很多文件,文件之间都是相辅相成有着编译的先后顺序,但是如果自己手动根据编译顺序编译文件造成速度非常慢。Makefile 是”自动化编译“,只需一个 make 指令系统就会根据编译顺序帮自己编译文件…

Java-Tomcat

一、web补充技术 ①:B/S架构 主流的方式,只要有浏览器即可。编程方式直接基于socket即可 ②:javascript 简称js,早期只是实现在客户端的浏览器的动态效果,但服务端不会解释运行,所以本质上是静态资源。 …

UE4_动画基础_角色的缩放

以第三人称模板进行制作。 一、首先为角色缩放新建粒子效果 1、新建niagara system,重命名为NS_Shrink。 2、双击打开设置参数: 发射器重命名: Emitter State: 发射器一次喷发数量: 粒子初始大小,生命周…

Go协程池gopool源码解析

1、gopool简介 Repository:https://github.com/bytedance/gopkg/tree/develop/util/gopool gopool is a high-performance goroutine pool which aims to reuse goroutines and limit the number of goroutines. It is an alternative to the go keyword. gopool的…

【Linux进阶之路】地址篇

文章目录 一、ipv4地址1. 基本概念2. 分类3.CIDR4.特殊的ip地址 二、IP协议1. 协议字段2.分片与重组3.路由 三、NAT技术1.公有和私有2.NAT3.NAPT 四、ARP协议1.MAC地址2.ARP 五、DHCP协议六、DNS协议尾序 一、ipv4地址 1. 基本概念 概念:IP地址,英文全…