Python日志系统详解:Logging模块最佳实践

news/2024/10/29 0:00:48/

Python日志系统详解:Logging模块最佳实践

在开发Python应用程序时,日志记录是排查问题、监控系统状态、优化性能的重要手段。Python标准库中提供了强大的logging模块,使开发者可以轻松实现灵活的日志系统。本文将详细介绍Python的logging模块,并分享一些在实际项目中提高日志质量和管理效率的最佳实践。
在这里插入图片描述

logging_5">1. logging模块的基本概念

logging模块中,主要涉及以下几个核心概念:

  1. Logger日志记录的入口,用于创建日志消息的对象。可以通过logger对象设置日志的级别和过滤条件。
  2. Handler:用于定义日志的输出位置,可以将日志输出到控制台、文件、远程服务器等。常用的HandlerStreamHandler(输出到控制台)和FileHandler(输出到文件)。
  3. Formatter:格式化日志内容,使日志输出更加易读。格式包括时间、日志级别、日志消息等信息。
  4. Log Level日志级别,用于过滤日志消息,常见的级别有DEBUGINFOWARNINGERRORCRITICAL

这些组件的组合可以形成一个灵活的日志系统,使得我们可以针对不同需求生成和输出日志
在这里插入图片描述

logging_17">2. logging的基本用法

以下是一个使用logging模块的简单示例:

python">import logging# 配置基本的日志设置
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')# 创建日志记录器
logger = logging.getLogger(__name__)# 记录不同级别的日志
logger.debug('这是一个DEBUG日志')
logger.info('这是一个INFO日志')
logger.warning('这是一个WARNING日志')
logger.error('这是一个ERROR日志')
logger.critical('这是一个CRITICAL日志')

在这个例子中,basicConfig用于配置日志的基本信息,包括日志的级别和格式。运行后,logger对象会输出INFO及以上级别的日志到控制台。
在这里插入图片描述

3. 日志级别的选择

日志级别是日志系统的重要参数,根据应用场景合理选择日志级别,能够帮助过滤无关信息,提升日志的可读性:

  • DEBUG:用于开发和调试时记录详细的信息。
  • INFO:记录程序运行的正常信息,例如启动和停止等。
  • WARNING:记录潜在的问题,程序可能正常运行,但未来可能出错。
  • ERROR:记录发生的错误,但不影响程序继续运行。
  • CRITICAL:记录系统崩溃或重要模块出错等重大问题。

日志级别的最佳实践

建议在开发阶段将日志级别设置为DEBUG,在生产环境中设置为INFO或更高的级别,以避免日志过于冗长。
在这里插入图片描述

4. 配置Handler和Formatter

logging模块允许通过添加多个HandlerFormatter,使日志记录更灵活。以下示例将日志输出到控制台和文件中,并设置不同的日志格式:

python">import logging# 创建日志记录器
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)# 创建控制台处理器和文件处理器
console_handler = logging.StreamHandler()
file_handler = logging.FileHandler('app.log')# 设置不同的日志级别
console_handler.setLevel(logging.INFO)
file_handler.setLevel(logging.ERROR)# 定义格式
console_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 应用格式到处理器
console_handler.setFormatter(console_formatter)
file_handler.setFormatter(file_formatter)# 添加处理器到logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)# 记录日志
logger.info('这是INFO级别的日志,将输出到控制台')
logger.error('这是ERROR级别的日志,将输出到文件')

在这个示例中:

  • 控制台处理器console_handler将INFO及以上级别的日志输出到控制台;
  • 文件处理器file_handler将ERROR及以上级别的日志输出到app.log文件。

通过不同的HandlerFormatter组合,可以实现不同级别和格式的日志输出。
在这里插入图片描述

5. 使用配置文件管理日志配置

在大型项目中,直接在代码中配置logging参数会导致代码冗长、不便维护。可以通过外部配置文件(如YAMLJSON)管理日志配置,提高可维护性。

loggingconfigfileConfig_103">使用logging.config.fileConfig

以下是一个基于.ini配置文件的示例:

# logging_config.ini
[loggers]
keys=root[handlers]
keys=consoleHandler, fileHandler[formatters]
keys=simpleFormatter, detailedFormatter[logger_root]
level=DEBUG
handlers=consoleHandler, fileHandler[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter
args=(sys.stdout,)[handler_fileHandler]
class=FileHandler
level=ERROR
formatter=detailedFormatter
args=('app.log', 'a')[formatter_simpleFormatter]
format=%(asctime)s - %(levelname)s - %(message)s[formatter_detailedFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

然后在Python代码中读取这个配置文件:

python">import logging
import logging.config# 读取日志配置文件
logging.config.fileConfig('logging_config.ini')# 获取日志记录器
logger = logging.getLogger()# 记录日志
logger.info('这是INFO日志')
logger.error('这是ERROR日志')

在这里插入图片描述

6. 进阶:为多模块项目配置日志

在大型项目中,通常会有多个模块,每个模块可能需要独立的日志记录器。可以使用__name__创建独立的logger实例,使每个模块都有自己的日志配置。例如:

python"># 在模块 module1.py 中
import logginglogger = logging.getLogger(__name__)def foo():logger.info("Module1 - foo函数执行")
python"># 在模块 module2.py 中
import logginglogger = logging.getLogger(__name__)def bar():logger.info("Module2 - bar函数执行")

在项目的主文件中配置日志

python">import logging
import module1
import module2logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')module1.foo()
module2.bar()

这样每个模块的日志都会记录模块名称,使调试更加方便。
在这里插入图片描述

7. 日志异常信息

为了记录更多调试信息,遇到异常时记录详细的堆栈信息是非常有帮助的。可以使用exc_info参数:

python">try:1 / 0
except ZeroDivisionError:logger.exception("捕获到ZeroDivisionError异常")

logger.exception会自动捕获异常的堆栈信息并记录到日志中,使错误排查更加高效。
在这里插入图片描述

8. 结语

Python的logging模块为日志记录提供了灵活的支持。在实际开发中,合理地使用日志级别、配置HandlerFormatter,并引入配置文件进行集中管理,可以极大提高日志系统的可维护性和有效性。希望本文的讲解能帮助你更好地掌握logging模块,为项目构建高效的日志系统。
在这里插入图片描述


http://www.ppmy.cn/news/1542720.html

相关文章

【C++】构造函数冒号后面的初始化列表使用小括号( )和大括号{ }的区别(回子的四种写法)

1、创建对象时,使用小括号( )和大括号{ }的区别 1)内置类型的初始值,以下三种方法没有区别 int x(0); int y 0; int z{0}; 2)自定义类型的赋值 Widget w1; 调用默认构造函数 Widget w2 w1; 调用拷贝构造函数&#xf…

【linux故障处理】【-bash: nginx: 未找到命令】

故障现象: [rootmini-71 nginx-1.24.0]# nginx -bash: nginx: 未找到命令 解决: # 打开环境变量配置文件 vim /etc/profile # 在文件末尾添加如下内容,指向nginx的安装目录 PATH$PATH:/usr/local/nginx/sbin # 重新加载使修改生效 so…

驾校小程序:一站式学车解决方案的设计与实践

​​一、引言 随着移动互联网技术的飞速发展,人们的生活方式和消费习惯正在发生深刻变化。驾校作为传统的服务行业,也面临着数字化转型的迫切需求。驾校小程序作为一种轻量级的应用,能够为用户提供便捷、丰富的学车服务,成…

Ubuntu20.04系统安装opencv

一、安装opencv 1、下载opencv-3.4.15数据包并解压 下载地址Release OpenCV 3.4.15 opencv/opencv GitHub 或官网下载地址 conda create -n opencv python3.8 conda activate opencv unzip opencv-3.4.15.zip 2、使用 cmake 安装 opencv 首先进入解压后的文件夹&…

构建中小企业设备管理平台:Spring Boot应用

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

【ios】---SwiftUI开发从入门到放弃

SwiftUI开发从入门到放弃 基本知识开发ios app1.打开Xcode,新建项目2.开发代码3.制作图标4.替换图标5.修改名称6.运行 Xcode界面 基本知识 与H5相对比 开发ios app 1.打开Xcode,新建项目 2.开发代码 import SwiftUI func mySelect() -> String {r…

leetcode hot100【LeetCode 104. 二叉树的最大深度】java实现

LeetCode 104. 二叉树的最大深度 题目描述 给定一个二叉树,找出其最大深度。 二叉树的深度为从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入&am…

Linux基础命令(五) 之 cat,head,tail,more,less,grep

目录 一,浏览普通文件内容 二,过滤文件内容显示--grep 参数及其作用 ​编辑 常见用法 一,浏览普通文件内容 注意:以上命令均可以结合管道符一起使用 二,过滤文件内容显示--grep 在指定的普通文件中查找并显示含有…