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

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

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

1. logging模块的基本概念

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

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

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

2. logging的基本用法

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

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,使日志记录更灵活。以下示例将日志输出到控制台和文件中,并设置不同的日志格式:

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)管理日志配置,提高可维护性。

使用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代码中读取这个配置文件:

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

在这里插入图片描述

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

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

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

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

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参数:

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

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

8. 结语

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

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

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

相关文章

Kubernetes:(二)K8Sv1.20二进制部署

文章目录 一、k8s项目架构二、二进制搭建 Kubernetes v1.20 (单master节点)1.操作系统初始化配置2.部署 docker引擎3. etcd的概念4. 证书认证5. node01 节点操作(192.168.44.10)6. node02 节点操作(192.168.44.40&…

arcgis pro 3.3.1安装教程

一、获取方式: http://dt4.8tupian.net/2/29913a61b1500.pg3二、软件目录: 三、安装步骤: (1)安装软件运行环境windowsdesktop-runtime 8.0.4; (2)选中安装文件arcgispro_33zh_cn_190127.exe&…

nfs作业

服务机 配置文件内容 客户机

QT实时显示日志内容

性能有待提高; 能够读取指定目录下的日志文件,显示在下拉框中。 选择某一个日志之后,点击获取数据按钮,能够实时刷新日志内容。 但是每次刷新都会对整个文件进行读取,文本框重新加载文本。效率很低,影响性能…

基于yolov8的布匹缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 基于yolov8的布匹缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili (一)简介 基于yolov8的布匹缺陷检测系统是在 PyTo…

着色器的认识

知识了解: 着色器: 顶点着色器: 用来描述顶点的特性,如位置、颜色等,其中,顶点:是指二维或三维空间中的一个点比如交点或者端点。 片元着色器:用来进行逐片元处理操作,比如光照、颜色叠加等&…

从零搭建开源陪诊系统:关键技术栈与架构设计

构建一个开源陪诊系统是一个涉及多种技术的复杂工程。为了让这个系统具备高效、可靠和可扩展的特点,我们需要从架构设计、技术栈选择到代码实现等方面进行全面的考量。本文将从零开始,详细介绍搭建开源陪诊系统的关键技术栈和架构设计,并提供…

react-signature-canvas 实现画笔与橡皮擦功能

react-signature-canvas git 地址 代码示例 import React, { Component } from react import { createRoot } from react-dom/clientimport SignaturePad from ../../src/index.tsximport * as styles from ./styles.module.cssclass App extends Component {state { trimmed…

Java知识巩固(十二)

I/O JavaIO流了解吗? IO 即 Input/Output,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因…

中间件安全(三)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 本文主要讲解apache命令执行漏洞(cve_2021_41773)。 靶场链接:Vulfocus 漏洞威胁分析平台 一,漏洞简介。 cve_2021_41773漏洞…

工欲善其事必先利其器——Anaconda安装教程(2024版本)

前言 在数据科学、机器学习、科学计算等领域,Python 因其简洁的语法和强大的库支持而广受欢迎。Anaconda 是一个流行的Python发行版,它包含了大量的科学计算和数据分析库,极大地方便了开发者和研究者的工作。本文将为您提供2024版本的Anacon…

ctfshow(155->158)--文件上传漏洞--绕过黑名单

Web155 进入界面: 审计: 前端校验:限制传入文件的后缀为.png MIME验证 黑名单过滤 思路/EXP: 先上传.user.ini文件: 将.user.ini.png文件上传,然后抓包去掉.png后缀,就同时绕过了前端校验…

第7次CCF CSP认证真题解

1、折点计数 题目链接&#xff1a;https://sim.csp.thusaac.com/contest/7/problem/0 100分代码&#xff1a; #include <iostream> using namespace std; int main(int argc, char *argv[]) {int n;cin >> n;int a[1010];for(int i 0; i < n; i){cin >&g…

我谈Canny算子

在Canny算子的论文中&#xff0c;提出了好的边缘检测算子应满足三点&#xff1a;①检测错误率低——尽可能多地查找出图像中的实际边缘&#xff0c;边缘的误检率&#xff08;将边缘识别为非边缘&#xff09;低&#xff0c;且避免噪声产生虚假边缘&#xff08;将非边缘识别为边缘…

STM32-Cube定时器TIM

一、内部时钟源 1、创建项目 File → New → STM32 project选择STM32F103C8T6单片机&#xff0c;命名TIM 2、配置单片机 1.打开USART1&#xff0c;方便我们与电脑连接查看数据 开启UART1并开启中断。 2、设置时钟源 开启外部高速晶振 将时钟频率设置为72MHz 设置调试模…

三款计算服务器配置→如何选择科学计算服务器?

科学计算在众多领域都扮演着关键角色&#xff0c;无论是基础科学研究还是实际工程应用&#xff0c;强大的计算能力都是不可或缺的。而选择一台合适的科学计算服务器&#xff0c;对于确保科研和工作的顺利进行至关重要。 首先&#xff0c;明确自身需求是重中之重。要仔细考虑计算…

【SSM详细教程】-14-SpringAop超详细讲解

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…

Go 1.19.4 命令调用、日志、包管理、反射-Day 17

1. 系统命令调用 所谓的命令调用&#xff0c;就是通过os&#xff0c;找到系统中编译好的可执行文件&#xff0c;然后加载到内存中&#xff0c;变成进程。 1.1 exec.LookPath&#xff08;寻找命令&#xff09; 作用&#xff1a; exec.LookPath 函数用于在系统的环境变量中搜索可…

numpy——数学运算

一、标量——矢量 import numpy as npa 3.14 b np.array([[9, 5], [2, 7]])print(a) print(b)# ---------- 四则运算 ---------- print(a b) # np.add print(a - b) # np.subtract print(a * b) # np.multiply print(a / b) # np.divide 二、矢量——矢量 import nump…

【JavaEE】【多线程】定时器

目录 一、定时器简介1.1 Timer类1.2 使用案例 二、实现简易定时器2.1 MyTimerTask类2.2 实现schedule方法2.3 构造方法2.4 总代码2.5 测试 一、定时器简介 定时器&#xff1a;就相当于一个闹钟&#xff0c;当我们定的时间到了&#xff0c;那么就执行一些逻辑。 1.1 Timer类 …