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.rhkb.cn/news/458641.html

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

相关文章

Java实现邮箱发送邮件添加定时任务(二)

上篇文章我们谈到邮件的发送,但是可以发现使用非常局限,这里我做了一个简单的修改,添加了定时发送功能,可以帮助我们处理很多繁琐的事 这里我写了一个简单的案例 1. 先在pom文件里面添加依赖 2.配置yml文件 3.写一个定时任务类…

python项目实战——多协程下载美女图片

协程 文章目录 协程协程的优劣势什么是IO密集型任务特点示例与 CPU 密集型任务的对比处理 I/O 密集型任务的方式总结 创建并使用协程asyncio模块 创建协程函数运行协程函数asyncio.run(main())aiohttp模块调用aiohttp模块步骤 aiofiles————协程异步函数遇到的问题一 await …

AI最新动态概览-2024年10月28日

1. 字节跳动加速欧洲布局,拟建AI研发中心 近日,有消息称字节跳动正积极筹备在欧洲设立AI研发中心,此举标志着该公司在全球技术版图上的又一重要扩张。随着人工智能技术的飞速发展,字节跳动正通过招兵买马,进一步巩固其…

Linux 进程优先级 进程切换

目录 优先级 概念 为什么优先级要限制在一定范围内 进程切换 方式 EIP寄存器(程序计数器) 进程在运行时会使用寄存器来保存临时数据 进程的上下文是什么? 进程的上下文保存到哪? 内核栈或专门的上下文结构也在内核空间?那为什么不直…

java 提示 避免用Apache Beanutils进行属性的copy。

避免用Apache Beanutils进行属性的copy。 Inspection info: 避免用Apache Beanutils进行属性的copy。 说明:Apache BeanUtils性能较差,可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier。 TestObject a new TestObject(); TestObject b new Te…

2024 最新 frida技术栈 第一部分

目录 1.下载 2. 安装 2.1. 命令 3.基本使用 3.1 列出运行的APP 3.2 列出所有APP 3.3 杀死进程 4. frida hook 方法 4.1 frida客户端命令行的参数 4.2. Frida两种操作模式 4.3. Frida操作APP的两种方式 4.3.1. attach模式 4.3.2. spawn模式 4.3.3 转发端口启…

RabbitMQ的Overview Totals是空

一、问题描述 RabbitMQ 版本:4.0.2,Erlang 版本:26.2.5.4。 RabbitMQ 页面管理(rabbitmq_management)的 Overview > Totals 是空: 二、原因分析 RabbitMQ 的配置: management_agent.disable_metrics_collector…

Hive的数据存储格式

目录 一、前言 二、存储格式 2.1、文本格式(TextFile) 2.1.1、定义与特点 2.1.2、存储与压缩 2. 1.3、使用场景 2.2、行列式文件(ORCFile) 2.2.1、ORC的结构 2.2.2、ORC的数据类型 2.2.3、ORC的压缩格式 2.2.3、ORC存储…

LVGL移植教程(超详细)——基于GD32F303X系列MCU

版本:LVGL Kernel V8.3.0,运行压力测试Demo Stress首先放一张最终Stress Demo 运行图: 一、准备 1. GD32 Keil工程 准备任意一个屏幕可以正常显示的GD32工程: 2. LVGL源码 最新版现在已经是V9.2了,这里我选择了…

XQT_UI 组件|03 |加载组件 XQtLoading

XQtLoading 使用文档 简介 XQtLoading 是一个自定义的加载动画组件,旨在为用户提供可配置的旋转花瓣动画效果。它可以在应用程序中用于指示加载状态,提升用户体验。 特征 可配置性:用户可以根据需求调整旋转周期、缩放周期、最大/最小缩放…

Bi-LSTM-CRF实现中文命名实体识别工具(TensorFlow)

项目源码获取方式见文章末尾! 回复暗号:13,免费获取600多个深度学习项目资料,快来加入社群一起学习吧。 **《------往期经典推荐------》**项目名称 1.【MobileNetV2实现实时口罩检测tensorflow】 2.【卫星图像道路检测DeepLabV3P…

关于嵌入式学习的一些短浅经验

一、写在前面 感谢在 10.23,各位大佬对我进行的模拟面试,我也发现了我对知识的不熟练的部分,比如 IPC 方法和线程同步方法的知识。模拟面试第四期-已经拿到大厂 OFFER 的研究生大佬-LINUX 卷到飞起_哔哩哔哩_bilibili 然后,沈阳…

uniapp+uniCloud前端独立开发全栈项目Vue3版本学习路线,轻松开发H5、微信小程序、APP

概述 嗨,大家好,我是爱搞知识的咸虾米,这个学习路线是uniappuniCloud生态开发微信小程序、H5、APP等实战项目,从零基础开始到各种类型的项目案例,使用比较新的vue3语法糖版本,通过前端的技术可以轻松开发上…

微信小程序——消息订阅

首先用到的就是wx.requestSubscribeMessage接口。 注意:用户发生点击行为或者发起支付回调后,才可以调起订阅消息界面 requestSubscribeMessage() {uni.requestSubscribeMessage({tmplIds: [],//需要订阅的消息模板的id的集合,一次调用最多可…

Docker 常用命令全解析:提升对雷池社区版的使用经验

Docker 常用命令解析 Docker 是一个开源的容器化平台,允许开发者将应用及其依赖打包到一个可移植的容器中。以下是一些常用的 Docker 命令及其解析,帮助您更好地使用 Docker。 1. Docker 基础命令 查看 Docker 版本 docker --version查看 Docker 运行…

向量检索学习记录

1、Faiss Faiss是一个用于高效相似搜索和密集向量聚类的库;(支持单个/多个GPU)官方文档:Home facebookresearch/faiss Wiki GitHub 安装(如果编译有问题,有些选项需要关下,比如GPU, Python&a…

从 Hadoop 迁移到数据 Lakehouse 的架构师指南

从 Hadoop 到数据湖仓一体架构的演变代表了数据基础架构的重大飞跃。虽然 Hadoop 曾经以其强大的批处理能力统治着大数据领域,但如今的组织正在寻求更敏捷、更具成本效益和现代化的解决方案。尤其是当他们越来越多地开始实施 AI 计划时。根本没有办法让 Hadoop 为 A…

【福建医科大学附属第一医院-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …

微信机器人自动回复了解下

现在使用微信来做私域营销和维护客户的非常多,在工作上会频繁地遭遇客户提出的相同问题,当我们的好友数量众多时,手动逐个回复可能会耗费大量的时间。 幸运的是,多微管理系统的自动回复功能为我们带来了福音。帮助咱们解决这一难…

原创作品——GIS和监控软件设计

这套数据可视化大屏软件UI设计旨在提供一个直观、高​‌‌效且易于理解的界面,用于展示和分析大量的能源数据和信息。以下是关于该系统UI设计的详细介绍: 整体布局与设计风格: 界面以蓝色调为主,代表冷静、专业和科技的氛围。 布…