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

news2024/11/15 10:11:37

在这里插入图片描述

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

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

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,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 / y
    except 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程序中的日志,从而提高软件的可维护性、可靠性和安全性。

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

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

相关文章

软件设计师全套备考系列文章5 -- 数据结构的基本概念与算法

软考-- 软件设计师(5)-- 数据结构的基本概念与算法 文章目录 软考-- 软件设计师(5)-- 数据结构的基本概念与算法前言一、基本概念二、算法 前言 考试时间:每年5月、11月,软件设计师每年都会开考。 考试条件…

【Linux修行路】文件系统之缓冲区

目录 ⛳️推荐 一、先看现象 二、用户缓冲区的引入 三、用户缓冲区的刷新策略 四、为什么要有用户缓冲区 五、现象解释 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 一、…

BUG——imx6u开发_结构体导致的死机问题(未解决)

简介: 最近在做imx6u的linux下裸机驱动开发,由于是学习的初级阶段,既没有现成的IDE可以使用,也没有GDB等在线调试工具,只能把代码烧写在SD卡上再反复插拔,仅靠卑微的亮灯来判断程序死在哪一步。 至于没有使…

新加坡服务器托管:数字化引擎,企业托管的未来明星

在新加坡这片充满活力的土地上,托管服务正逐渐成为企业数字化转型与国际化战略的重要支撑。凭借其独特的地理位置、完善的基础设施、严格的法规环境以及政府对科技创新的积极推动,新加坡不仅成为了亚太地区的经济枢纽,也成为了全球企业托管业…

鸿蒙HarmonyOS实战:IPC与RPC设备内进程通信

基本 IPC(Inter-Process Communication)与RPC(Remote Procedure Call)用于实现跨进程通信,不同的是前者使用Binder驱动,用于设备内的跨进程通信,后者使用软总线驱动,用于跨设备跨进…

Leetcode JAVA刷刷站(53)最大子数组和

一、题目概述 二、思路方向 这个问题是一个经典的算法问题,称为“最大子序和”(Maximum Subarray Problem)。解决这个问题的一个高效方法是使用“Kadanes Algorithm”,它只需要遍历数组一次,就能在 O(n) 时间复杂度内…

模拟JDBC本质

以记事本形式模拟 编译所有文件,并运行 如果换成Oracle 重新编译并运行 利用反射,但是这种方式,还是需要重新编译 改成Oracle 再次编译 以读取配置文件的方式 编译之后 以后无需再次编译源码 只需要改配置文件 修改配置

如何将网站地图Sitemap提交至百度、谷歌及Bing搜索引擎

原文:如何将网站地图Sitemap提交至百度、谷歌及Bing搜索引擎 - 孔乙己大叔 (rebootvip.com) 在当今高度竞争的互联网环境中,搜索引擎优化(SEO)对于网站的可见性和成功至关重要。网站地图(Sitemap)&#xff…

新媒体智能化与定制开发 AI 智能名片小程序在工业 4.0 中的作用

摘要:本文探讨了新媒体作为客体所具有的智能以及在工业 4.0 进程中的重要性。分析了人赋予新媒体的四个方面智能,包括感知智能、运算智能、认知智能和智慧行为。同时,结合定制开发 AI 智能名片小程序这一具体案例,阐述了新媒体在工…

【ECMAScript性能优化的技巧与陷阱】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

csrf漏洞(三)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 本文依靠phpstudy以及dvwa靶场进行操作,具体搭建流程参考:xss漏洞(二,xss靶场搭建以及简单利用) 前篇…

有头单向链表的函数操作(详细版)

【1】代码展示 #include <stdio.h> #include <stdlib.h> typedef char datatype; // 重定义字符类型 typedef struct node {datatype data; // 数据用来存数据struct node *next; // 指针域用来存下一个节点的地址 } Node_t, *Node_p; // 重定义结构体数据…

5G三防加固平板电脑的特点与应用

随着信息技术的不断发展&#xff0c;5G通信技术也逐渐融入到三防平板电脑中。5G三防加固平板电脑是一种专为恶劣环境和工作场景设计的移动设备。它结合了5G通信技术、三防功能和加固设计&#xff0c;可以为用户带来更加高效、稳定、安全的使用体验。下面&#xff0c;我们来看看…

手把手系列 | 使用Milvus、Llama 3、Ollama、LangChain本地设置RAG应用

随着 Llama、Mistral、Gemma 等开源大语言模型&#xff08;LLM&#xff09;的出现&#xff0c;我们越来越能感受到 LLM 的力量&#xff0c;而本地运行基于 LLM 的 RAG 应用的需求越来越强烈。在将应用推至生产环境前&#xff0c;我们往往都需要先本地运行和测试。 因此&#xf…

[鹏城杯 2022]简单的php

题目源代码 <?phpshow_source(__FILE__); $code $_GET[code]; if(strlen($code) > 80 or preg_match(/[A-Za-z0-9]|\|"||\ |,|\.|-|\||\/|\\|<|>|\$|\?|\^|&|\|/is,$code)){die( Hello); }else if(; preg_replace(/[^\s\(\)]?\((?R)?\)/, , $code…

qemu启动iso/vmdk转换为qcow2镜像

安装qemu安装 https://qemu.weilnetz.de/w64/ 下载链接 Rock安装 https://rockylinux.org/zh-CN/download 下载&#xff0c;可以使用360等国产浏览器&#xff0c;可能自带加速功能&#xff0c;我这里使用最小版本 安装后在vmware中启动&#xff0c;无ip解决方案 执行命令 n…

OV SSL证书:增强网站信任与安全的重要保障

随着互联网的快速发展&#xff0c;电子商务、在线金融等行业的繁荣&#xff0c;网络安全问题日益凸显。为了确保用户数据的安全性和传输过程中的加密性&#xff0c;SSL证书&#xff08;Secure Sockets Layer&#xff09;成为了保护网站安全的重要工具。其中&#xff0c;OV SSL证…

跨平台无缝编辑,2024年免费视频剪辑工具全解析

在众多视频剪辑工具中&#xff0c;免费视频剪辑软件凭借其易用性、功能丰富性以及零成本的优势&#xff0c;赢得了广大用户的青睐。今天&#xff0c;就让我们一起盘点那些2024年大家都在用的免费视频剪辑软件&#xff0c;探索它们如何助力我们轻松实现创意梦想。 1.福昕视频剪…

基于springboot的太原学院商铺管理系统--论文pf

TOC springboot486基于springboot的太原学院商铺管理系统--论文pf 第1章 绪论 1.1 研究背景 互联网概念的产生到如今的蓬勃发展&#xff0c;用了短短的几十年时间就风靡全球&#xff0c;使得全球各个行业都进行了互联网的改造升级&#xff0c;标志着互联网浪潮的来临。在这…

机器人策略学习的Game Changer?伯克利提出Body Transformer

过去几年间&#xff0c;Transformer 架构已经取得了巨大的成功&#xff0c;同时其也衍生出了大量变体&#xff0c;比如擅长处理视觉任务的 Vision Transformer&#xff08;ViT&#xff09;。本文要介绍的 Body Transformer&#xff08;BoT&#xff09; 则是非常适合机器人策略学…