【python】Python中的日志模块logging使用技巧与应用实战

2024-08-21 05:52

本文主要是介绍【python】Python中的日志模块logging使用技巧与应用实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:python综合应用,基础语法到高阶实战教学
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Python中日志模块logging
    • 一、日志模块基础
      • 1.1 导入日志模块
      • 1.2 配置日志
      • 1.3 记录日志
      • 1.4 示例代码
    • 二、日志模块的高级特性
      • 2.1 Logger对象
      • 2.2 Handler对象
      • 2.3 Formatter对象
      • 2.4 示例代码:日志输出到文件
      • 2.5 日志级别和过滤器
      • 2.6 日志轮转
      • 2.7 日志配置文件
      • 2.8 示例代码:使用配置文件
      • 注意事项
      • 日志的其他一些高级用法
        • 1. 日志上下文(Context)
        • 2. 异步日志
        • 3. 日志监控和警报
        • 4. 日志的归档和清理
        • 5. 安全性考虑

Python中日志模块logging

在Python开发中,日志记录是一个非常重要的环节。它不仅有助于开发者追踪程序的执行流程,还能在出现问题时提供关键信息,帮助快速定位并解决问题。Python标准库中的logging模块提供了灵活且强大的日志记录功能,支持将日志输出到不同的目标(如文件、终端等),并支持不同级别的日志记录(如调试、信息、警告、错误等)。本文将结合实际案例,详细介绍logging模块的基础用法和高级特性。

一、日志模块基础

1.1 导入日志模块

首先,我们需要导入logging模块。这是使用日志功能的前提。

import logging

1.2 配置日志

在使用logging模块之前,我们可以配置日志的基本设置,如设置日志级别、输出格式等。以下是一个简单的配置示例:

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
  • level: 设置日志级别,可以选择DEBUGINFOWARNINGERRORCRITICAL
  • format: 设置日志输出格式,上述格式中包含了时间、级别和消息。

1.3 记录日志

配置好日志后,我们就可以使用logging模块记录日志了。例如:

logging.debug("This is a debug message")
logging.info("This is an info message")
logging.warning("This is a warning message")
logging.error("This is an error message")
logging.critical("This is a critical message")

1.4 示例代码

下面是一个结合上述内容的示例代码,演示如何在代码中使用logging模块:

import logging# 配置日志
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')def divide(x, y):try:result = x / yexcept ZeroDivisionError:logging.error("Attempted to divide by zero")else:logging.info(f"The result of {x}/{y} is {result}")if __name__ == "__main__":# 记录日志logging.debug("Program starts")# 调用函数divide(10, 2)divide(8, 0)# 记录日志logging.debug("Program ends")

在这里插入图片描述

在这个例子中,我们定义了一个divide函数,该函数尝试执行除法运算。如果发生ZeroDivisionError,则记录一个错误日志;否则,记录一个信息日志。通过配置日志,我们可以清晰地看到程序的执行流程,包括开始、结束以及可能发生的异常情况。

二、日志模块的高级特性

2.1 Logger对象

Logger对象是logging模块中用于记录日志的主要接口。我们可以创建自己的Logger对象,也可以使用默认的根Logger对象。Logger对象提供了debug()info()warning()error()critical()等方法来记录不同级别的日志。

2.2 Handler对象

Handler对象用于指定日志的输出目标,如文件、终端、网络等。Handler对象可以添加到Logger对象中,以处理相应级别的日志消息。logging模块提供了多种Handler,如FileHandler(将日志写入文件)、StreamHandler(将日志输出到终端)等。

2.3 Formatter对象

Formatter对象用于指定日志消息的输出格式。通过Formatter,我们可以自定义日志消息的显示方式,包括日期、时间、日志级别、消息内容等。

2.4 示例代码:日志输出到文件

下面是一个将日志输出到文件的示例代码:

import logging# 创建一个Logger对象
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)# 创建一个Formatter对象,指定日志消息的格式
format = '%(asctime)s - %(levelname)s - %(message)s'
formatter = logging.Formatter(format)# 创建一个FileHandler对象,将日志输出到文件
file_handler = logging.FileHandler('output.txt')
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)# 将FileHandler对象添加到Logger对象中
logger.addHandler(file_handler)# 创建一个StreamHandler对象,将日志输出到终端
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(formatter)# 将StreamHandler对象也添加到Logger对象中
logger.addHandler(console_handler)# 记录日志
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")# 移除一个Handler(如果需要的话)
# logger.removeHandler(file_handler)# 关闭所有Handlers(通常不需要手动调用,因为Python解释器会在退出时自动处理)
# 但如果程序需要长时间运行,并且希望定期关闭和重新打开日志文件,那么可能需要这样做
# for handler in logger.handlers[:]:
#     handler.close()
#     logger.removeHandler(handler)# 注意:在上面的代码中,我们没有显式地导入sys模块,但如果你打算将日志输出到标准输出(即终端),
# 并且想要使用sys.stdout作为StreamHandler的参数,那么你需要先导入sys模块:
# import sys
# 完整的示例,包括导入sys模块
import logging
import sys# 创建一个Logger对象
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)# 创建一个Formatter对象,指定日志消息的格式
format = '%(asctime)s - %(levelname)s - %(message)s'
formatter = logging.Formatter(format)# 创建一个FileHandler对象,将日志输出到文件
file_handler = logging.FileHandler('output.txt')
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)# 创建一个StreamHandler对象,将日志输出到终端
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(formatter)# 将Handlers添加到Logger对象中
logger.addHandler(file_handler)
logger.addHandler(console_handler)# 记录日志
logger.debug("This debug message will appear in the console but not in the file")
logger.info("This info message will appear in both the console and the file")
logger.warning("This is a warning")
logger.error("This is an error")
logger.critical("This is a critical error")

在这里插入图片描述
并且将日志输出到文件
在这里插入图片描述

2.5 日志级别和过滤器

logging模块中,日志级别用于控制日志消息的输出。默认情况下,只有级别大于或等于Logger对象设置的级别的日志消息才会被处理。此外,我们还可以使用过滤器(Filter)来进一步控制哪些日志消息应该被处理。

2.6 日志轮转

对于长时间运行的应用程序,日志文件可能会变得非常大。为了管理这些文件,我们可以使用日志轮转(Log Rotation)功能。然而,logging模块本身并不直接支持日志轮转,但我们可以使用第三方库(如logrotate,在Linux环境下,或者RotatingFileHandler,它是logging.handlers模块的一部分)来实现这一功能。

2.7 日志配置文件

对于复杂的应用程序,直接在代码中配置日志可能会变得繁琐且难以维护。为了解决这个问题,logging模块支持从配置文件中读取日志配置。配置文件可以是Python文件、JSON文件或YAML文件等。使用配置文件可以让我们将日志配置与应用程序代码分离,从而更容易地进行修改和维护。

2.8 示例代码:使用配置文件

下面是一个使用JSON配置文件配置日志的示例。首先,我们创建一个名为logging_config.json的配置文件:

{"version": 1,"disable_existing_loggers": false,"formatters": {"simple": {"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"}},"handlers": {"console": {"class": "logging.StreamHandler","level": "DEBUG","formatter": "simple","stream": "ext://sys.stdout"},"file": {"class": "logging.FileHandler","level": "INFO","formatter": "simple","filename": "app.log"}},"loggers": {"my_app": {"handlers": ["console", "file"],"level": "DEBUG","propagate": false}},
"root": {"handlers": ["console"],"level": "INFO"}
}

然后,在Python代码中,我们可以使用logging.config.dictConfig()函数来加载这个配置文件,并应用配置:


import json
import logging.config# 加载日志配置文件
with open('logging_config.json', 'r') as f:config = json.load(f)
logging.config.dictConfig(config)# 获取配置好的Logger对象
logger = logging.getLogger('my_app')# 记录日志
logger.debug("This debug message will appear in the console and the file")
logger.info("This info message will appear in both the console and the file")
logger.warning("This is a warning")
logger.error("This is an error")
logger.critical("This is a critical error")# 注意:由于我们在配置文件中将'my_app' logger的propagate属性设置为False,
# 设置propagate参数为False,表示不再传递消息到父记录器
# 因此'my_app' logger的日志消息不会传播到root logger。
# 如果我们尝试获取root logger并记录日志,它只会按照root logger的配置(即只输出到控制台)来工作。
root_logger = logging.getLogger()
root_logger.info("This info message from the root logger will only appear in the console")

在这里插入图片描述
看下生成的日志文件
在这里插入图片描述

注意事项

  1. 配置文件中的路径:在配置文件中指定的文件路径(如filename)是相对于当前工作目录的。确保你的应用程序知道在哪里查找这些文件。

  2. 日志级别:每个handler和logger都可以有自己的日志级别。handler的级别决定了哪些级别的日志消息会被该handler处理,而logger的级别决定了哪些级别的日志消息会被发送到该logger的handlers。

  3. 传播(Propagation):默认情况下,如果一个logger没有处理一个日志消息(即它的级别高于logger的级别),那么该消息会被传播到它的父logger。但是,我们可以通过将logger的propagate属性设置为False来阻止这种传播。

  4. 日志配置的性能:在大型应用程序中,日志配置可能会对性能产生影响。确保你仔细规划你的日志策略,以避免不必要的性能开销。

  5. 安全性和隐私:在记录日志时,要特别注意不要记录敏感信息(如密码、个人身份信息等)。始终确保你的日志策略符合你的组织的安全和隐私政策。

  6. 调试和排错:日志是调试和排错的重要工具。确保你的日志策略足够详细,以便在需要时能够提供足够的上下文信息。但是,也要避免记录过多的日志,因为这可能会使问题变得更加难以诊断。

日志的其他一些高级用法

1. 日志上下文(Context)

在复杂的系统中,日志消息可能来自于不同的线程、不同的模块或不同的请求。为了更容易地追踪和关联这些日志消息,我们可以在日志消息中包含上下文信息,如用户ID、请求ID、线程ID等。

虽然Python的logging模块本身不直接支持日志上下文,但我们可以通过几种方式来实现:

  • 使用logging.extra:在记录日志时,可以通过在日志记录方法(如debug(), info(), warning()等)中传递一个extra参数来附加额外的上下文信息。这些信息将作为日志记录的一部分被格式化。

  • 使用上下文管理器:可以编写自定义的上下文管理器,该管理器在进入上下文时设置全局变量或线程局部变量来存储上下文信息,并在退出上下文时清除它们。然后,在日志格式化器中使用这些信息。

  • 使用第三方库:有些第三方库(如structlog)提供了更高级的日志功能,包括自动上下文管理。

2. 异步日志

在异步Python程序中(使用asyncio库),日志记录可能需要特别注意。由于异步代码的执行方式(即事件循环中的协程调度),直接在协程中调用阻塞的日志记录方法(如文件写入)可能会影响程序的性能。

为了解决这个问题,可以使用logging模块的异步支持(如果可用)或编写自定义的异步日志处理器。然而,需要注意的是,Python标准库中的logging模块直到较新的版本才开始提供对异步日志的原生支持。

3. 日志监控和警报

在生产环境中,仅仅记录日志是不够的。我们还需要监控系统中的日志,以便在出现问题时及时得到警报。这通常涉及到日志的集中管理、分析和警报系统。

  • 日志集中管理:可以使用日志聚合工具(如Logstash、Fluentd等)将来自不同源和系统的日志收集到一个中心位置。

  • 日志分析:使用日志分析工具(如Splunk、ELK Stack等)对收集的日志进行搜索、分析和可视化。

  • 警报系统:配置警报规则,以便在检测到特定日志模式(如错误日志、异常日志等)时发送警报(如电子邮件、短信、Slack通知等)。

4. 日志的归档和清理

随着时间的推移,日志文件会积累得越来越多,占用大量的磁盘空间。因此,需要定期归档和清理旧的日志文件。

  • 日志轮转:如前所述,可以使用RotatingFileHandler或第三方工具(如logrotate)来定期轮转日志文件。

  • 归档:将旧的日志文件压缩并存储到归档目录中,以便在需要时检索。

  • 清理:删除过期的日志文件以释放磁盘空间。

5. 安全性考虑

在记录日志时,必须特别注意安全性,以避免敏感信息的泄露。

  • 避免记录敏感信息:确保不要在日志中记录密码、个人身份信息(PII)、密钥等敏感信息。

  • 日志文件的访问控制:确保只有授权用户才能访问日志文件。

  • 加密日志存储:如果日志需要存储在不受信任的位置(如云服务提供商的存储桶),请考虑对日志进行加密。

  • 审计日志:对于需要符合特定法规(如GDPR、HIPAA等)的应用程序,可能需要记录审计日志以证明合规性。

通过以上方法,可以有效地管理和利用Python程序中的日志,从而提高软件的可维护性、可靠性和安全性。

这篇关于【python】Python中的日志模块logging使用技巧与应用实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092310

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于