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,一经查实,立即删除!

相关文章

SpringBoot实现增删改查

Spring Boot 是一个非常流行的 Java 开发框架,它简化了基于 Spring 框架的应用程序的开发过程。下面是一个简单的示例,展示了如何使用 Spring Boot 实现增删改查功能。 首先,你需要确保你的项目中已经添加了 Spring Boot 的依赖,…

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

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信息:修改文档属性、页码编号、页面链接、页面尺寸;删除自动打开网页等动作,去除复制及打印限制;设置阅读…

SQLite数据库的性能问题并不是单纯地由数据量的大小决定的,而是受到多种因素的综合影响。以下是一些可能导致SQLite性能问题的因素

SQLite数据库的性能问题并不是单纯地由数据量的大小决定的,而是受到多种因素的综合影响。以下是一些可能导致SQLite性能问题的因素: 数据量:当SQLite数据库中的数据量增长到一定程度时,查询、插入和更新等操作可能会变得缓慢。这…

进程替换exec系列介绍

ececl,execlp,execle,execv,execvp //库函数 execve //系统调用 1.execl which ps #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() {printf("main pid%d\n",getpid());execl("/usr/bin/ps","ps&qu…

.Net HttpClient应用

.NET HttpClient 是一个类型&#xff0c;在 System.Net.Http 命名空间中&#xff0c;用于发送 HTTP 请求和接收 HTTP 响应。它是 .NET 框架和 .NET Core 中用于处理 HTTP 通信的主要工具。HttpClient 提供了一个高级别的 API&#xff0c;用于向 Web 服务发送请求并接收响应&…

数据仓库作业四:第7章 数据的属性与相似性

目录 第7章 数据的属性与相似性作业题 第7章 数据的属性与相似性 作业题 1、设有10个二元属性&#xff0c;3个数据对象的数据集&#xff08;表1&#xff09;。 id A 1 A_1 A1​ A 2 A_2 A2​ A 3 A_3 A3​ A 4 A_4 A4​ A 5 A_5 A5​ A 6 A_6 A6​ A 7 A_7 A7​ A 8 A_8 A8​…

工业通信原理——Modbus-TCP通信C语言程序代码

工业通信原理——Modbus-TCP通信C语言程序代码 前言 简单的Modbus-TCP通信的C语言程序代码示例,包括底层驱动层和应用层。 C语言程序代码详解 底层驱动层(modbus_driver.c): #include <stdio.h> #include <stdint.h> #include <stdbool.h>// 定义Mo…

蓝桥杯 试题 基础练习 十六进制转八进制

资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述   给定n个十六进制正整数&#xff0c;输出它们对应的八进制数。输入格式   输入的第一行为一个正整数n &#xff08;1&…

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

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

2024.4.7周报

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

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

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

Mysql服务器主从相关

一主一从 准备两台服务器(以53为主,54为从)启动主服务器binlog日志 vim /etc/my.cnf.d/mysql-server.cnf [mysqld] server-id53 //指定主服务器的server-id为53 log-binmysql53 //修改binlog日志命名 :wqsystemctl restart mysqld //重载mysqld服务,使得以上配置生效 创…

11-新热文章-实时计算

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

备战蓝桥杯---最长公共子序列(LCS)模板

题目链接&#xff1a;最长公共子序列 import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner;public class Main {public static void main(String[] args){Scanner scannernew Scanner(System.in);int nscanner.nextInt();i…

C++ sleep相关延时函数

目录 秒相关单位进制转换 sleep() 函数&#xff1a; usleep() 函数&#xff1a; nanosleep() 函数&#xff1a; C11及以后版本的std::this_thread::sleep_for()&#xff1a; 秒相关单位进制转换 秒&#xff08;second, s&#xff09;是国际单位制&#xff08;SI&#xff…

vue watch监听的多种使用

简述&#xff1a;vue 的watch的监听使用的几种写法。常用第4中写法。 一、$route监听路由跳转 前提&#xff1a;当需要前端监听路由跳转的时候&#xff0c;一般写在App.vue入口 //App.vue //vue2、uniapp写法 watch: {$route(to, from) {if (hasPermission(to.path)) {this…

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

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