如何使用 Python 的 logging 模块记录日志

news2024/11/23 15:51:57

如何使用 Python 的 logging 模块记录日志

在编写 Python 程序时,日志记录是一个非常重要的部分。日志不仅帮助你在开发过程中调试代码,还可以在程序正式运行时提供诊断信息,帮助定位问题。如果你正在构建一个复杂的系统或者开发大型应用程序,日志更是不可或缺的工具。Python 提供了强大且灵活的日志模块 logging,通过它,你可以记录各种类型的日志信息,从调试信息到错误报告。

在本文中,我们将介绍 Python 的 logging 模块,帮助你了解如何使用这个模块来记录和管理日志。我们将从基础开始,逐步扩展到更高级的使用方式,适合新手阅读。

在这里插入图片描述

为什么要使用日志?

在开始之前,让我们先了解一下为什么要使用日志。在编写程序时,调试通常是不可避免的。初学者可能会倾向于使用 print() 语句来输出调试信息,这确实可以在简单程序中起到作用。但随着程序的复杂性增加,print() 的缺点就逐渐显现出来:

  1. 不可控:当你有很多 print() 语句时,它们会出现在终端的各个地方,难以管理。
  2. 灵活性差:你无法轻松地调整哪些信息应该被输出、保存到文件中或者发送到其他地方。
  3. 无法区分日志级别print() 不能区分输出的重要性。例如,调试信息和错误信息都混在一起。

相比之下,logging 模块具有以下优势:

  1. 多种日志级别logging 提供了多种日志级别,如 DEBUG、INFO、WARNING、ERROR 和 CRITICAL,帮助你根据重要性区分日志。
  2. 灵活的输出方式:日志可以输出到控制台、文件,甚至可以通过网络发送到远程服务器。
  3. 可配置性强:你可以通过配置不同的日志记录器、处理器和格式化器来自定义日志的行为。

了解了这些背景后,让我们一步步深入了解如何使用 logging 模块。

基本使用

首先,让我们从如何记录简单的日志开始。要使用 logging 模块,首先要导入它,并设置日志记录的基础配置。

import logging

logging 模块提供了一个简单的 basicConfig() 函数,用于设置基本的日志配置。你可以指定日志的输出格式、日志级别以及输出位置(例如文件或控制台)。

记录一个简单的日志

我们可以从最基本的例子开始,记录一条简单的日志:

import logging

logging.basicConfig(level=logging.DEBUG)
logging.debug("这是一个调试信息")
logging.info("这是一个信息")
logging.warning("这是一个警告")
logging.error("这是一个错误")
logging.critical("这是一个严重错误")

在这个例子中,basicConfig() 设置了日志级别为 DEBUG,这意味着从 DEBUG 级别及更高的重要级别的信息都会被记录并输出到控制台。每个日志级别表示不同的严重性:

  • DEBUG: 调试信息,最详细的日志,用于诊断问题。
  • INFO: 普通运行时消息,比如程序启动或结束的信息。
  • WARNING: 表示潜在的问题,程序可能仍然正常运行。
  • ERROR: 错误信息,但程序仍然可以继续运行。
  • CRITICAL: 严重错误,表示程序可能无法继续运行。

上面的代码输出如下:

DEBUG:root:这是一个调试信息
INFO:root:这是一个信息
WARNING:root:这是一个警告
ERROR:root:这是一个错误
CRITICAL:root:这是一个严重错误

输出到文件

在某些情况下,我们希望将日志输出到文件中,而不仅仅是在控制台显示。我们可以通过 basicConfig()filename 参数来实现这一点:

logging.basicConfig(filename='app.log', level=logging.INFO)

现在,所有的日志信息都将被写入到 app.log 文件中,而不是显示在控制台。为了避免日志文件变得太大,你还可以设置日志文件的大小限制或按时间进行日志轮转(我们将在后面介绍)。

配置日志格式

默认的日志格式可能不够直观或易于阅读。幸运的是,logging 模块允许我们通过 format 参数自定义日志的输出格式。一个常见的日志格式可能包括时间戳、日志级别、消息等。

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)

在这个例子中,日志的格式被设置为:

时间戳 - 日志记录器名称 - 日志级别 - 消息

输出可能如下所示:

2024-10-07 10:45:23 - root - INFO - 这是一个信息
2024-10-07 10:45:23 - root - WARNING - 这是一个警告

日志格式说明

  • %(asctime)s: 输出当前时间。
  • %(name)s: 日志记录器的名称,通常为 root,如果没有特别设置。
  • %(levelname)s: 日志级别名称,如 INFOWARNING
  • %(message)s: 日志的具体消息内容。

通过自定义这些格式占位符,我们可以使日志变得更加清晰和易读。

日志处理器和格式化器

logging 模块的强大之处在于它使用了一个灵活的层次结构来管理日志。这些层次结构由三个主要部分组成:

  1. 记录器(Logger):用于产生日志消息的入口,通常通过 logging.getLogger() 来创建。
  2. 处理器(Handler):负责将日志消息发送到合适的输出位置(如控制台、文件或网络)。
  3. 格式化器(Formatter):定义日志的输出格式。

使用不同的处理器

除了使用 basicConfig() 简单设置日志,我们还可以手动配置日志记录器和处理器,从而实现更细致的控制。以下是一个使用控制台和文件处理器的例子:

logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

# 创建一个控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.WARNING)

# 创建一个文件处理器
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.DEBUG)

# 创建格式化器并添加到处理器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# 将处理器添加到记录器
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# 测试日志输出
logger.debug('这是一个调试信息')
logger.info('这是一个信息')
logger.warning('这是一个警告')
logger.error('这是一个错误')
logger.critical('这是一个严重错误')

在这个例子中,我们创建了一个自定义的日志记录器,并设置了两个处理器:一个用于将日志输出到控制台,另一个用于将日志输出到文件。不同的处理器可以设置不同的日志级别。例如,控制台处理器只记录 WARNING 级别及以上的日志,而文件处理器记录所有日志。

日志轮转

在长时间运行的程序中,日志文件可能会变得非常大。为了防止日志文件过大,可以使用日志轮转机制。Python 提供了 RotatingFileHandler,可以在文件达到指定大小时自动创建新文件:

from logging.handlers import RotatingFileHandler

rotating_handler = RotatingFileHandler('app.log', maxBytes=2000, backupCount=5)
logger.addHandler(rotating_handler)

在这个例子中,app.log 文件最大为 2000 字节,日志文件超过这个大小后会自动创建一个新文件,最多保留 5 个旧文件。

结束语

Python 的 logging 模块是一个强大且灵活的工具,适用于各种规模的项目。从简单的控制台日志到复杂的多处理器、多格式化器的日志系统,它都能轻松胜任。对于新手来说,理解 logging 的基本概念和使用方法是一个重要的编程技巧。

在实际项目中,日志不仅可以帮助你调试代码,还能记录程序运行时的重要信息,帮助你在程序出现问题时快速定位和解决问题。因此,熟练掌握日志记录的技巧对提升编程效率大有裨益。

希望通过这篇文章,你对 Python 的 logging 模块有了更深入的了解。如果你是一个新手,不妨从简单的日志记录开始,逐步掌握更多高级功能。

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

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

相关文章

【数据结构】【队列】算法汇总

一、顺序队列【相当于一维数组】 1.准备工作 #define MAXQSIZE 100 typedef struct{QElemType*base;int front;int rear; }SqQueue; 2.队满,队空。入队,出队 二、链式队列 1.准备工作 typedef struct Qnode{ElemType data;struct Qnode*next; }Qnod…

深入浅出解析大模型:探索智能体(Agent)

大语言模型 vs 人类 大语言模型很强大,就像人类的大脑一样拥有思考的能力。如果人类只有大脑,没有四肢,没有工具,是没办法与世界互动的。如果我们能给大模型配备上四肢和工具呢?大模型是不是就会打破次元壁&#xff0…

GD32F4xx USB MSC Host调试记录

本文记录GD32F4xx MCU的RTX系统工程内移植USB MSC Host的例程代码,适配自制的电路板,实现向USB内写入数据。有关USB的一些基础信息,可以参考本专栏的另一篇文章《GD32 MCU USB开发学习记录》。 目录 1. USB MSC host 例程1.1、硬件接口2.2、USB msc host 例程2.2.1 工程目录…

dz论坛可可积分商城插件价值399元

界面简洁美观大方,适合各类站点。支持多用户商城,可让商家入驻站点发布商品,亦可站长自己发布商品。支持向商家抽佣抽成功能,可设置商家在成交商品后按一定比例扣除抽成,达到网站盈利目的采用队列技术处理,…

【ubuntu22.04】 搭建自己的镜像站 【harbor】【docker compose】【超详细】

文章目录 什么是 harbor特点主要功能 部署配置 dns初始化下载 dns编辑 named.conf.local编辑 named.conf.options配置正向解析配置反向解析解析扩展 部署 harbor修改配置执行 prepare执行 install.sh查看镜像访问 自制镜像创建镜像仓库上传镜像开始推送拉取镜像 什么是 harbor …

宏队列和微队列

1、javascript是一个单线程语言。 javascript 语言的目的(待补充) 2、主线程执行完成之后,再执行微队列,微队列执行完成后再执行宏队列 3、promise的构造函数传入的回调函数是同步执行 4、promise的then函数会直接加入微队列&…

Java 中的 LinkedHashMap

让我们从一个简单的 Java 代码片段开始,演示如何在 Java 中创建和使用 LinkedHashMap。 import java.util.LinkedHashMap; public class LinkedHashMapCreation { public static void main(String[] args) { // Create a LinkedHashMap of S…

【AI知识点】批归一化(Batch Normalization)

批归一化(Batch Normalization,BN) 是一种用于加速神经网络训练并提高模型稳定性的方法,最早由 Sergey Ioffe 和 Christian Szegedy 在 2015 年提出。批归一化通过在每一层对神经网络中的激活值进行标准化,使得每一层的…

半路出家:如何转行成为软件开发者——之找到一份工作

一、前言 一个半路出家的软件开发者,尽管只有短短几年软件开发的相关经验,却可以凭借他在其他领域积累的丰厚经验,最终一举超过单纯拥有更多软件开发经验的同行【有时拥有不同的专业背景(甚至是与软件完全不搭界的行业&#xff09…

SpringBoot赋能旅游管理:系统设计与实现

第三章 系统分析 3.1可行性分析 对所有的系统来说,都有可能会受到时间和空间上的制约。所以,我们在设计每一个项目的时候,必须对该系统实行可行性分析,这样不但能够降低项目的危害,还能改降低人力、物力和财力的损耗。…

弱网(不限于 Wi-Fi)环境的传输优化分析

参见 Wi-Fi弱网传输优化不成功有感 早在几年前还做传输优化时,我就非常不赞同在弱网环境激进传输的优化策略,我一直觉得这是在劣化传输,这观点一直影响着我,我也屡次因为这个与经理发生冲突。这观点如下表述: 弱网环…

【SpringSecurity】基本流程

【中文文档: Spring Security 中文文档 :: Spring Security Reference】 【英文文档&#xff1a;Spring Security】 以下内容只是记录springsecurity最简单的一种验证流程&#xff0c;所有配置基本都是默认的配置。 引入依赖 <dependency><groupId>org.springf…

GPU Puzzles讲解(一)

GPU-Puzzles项目可以让你学习到GPU编程和cuda核心并行编程的概念&#xff0c;通过一个个小问题让你理解cuda的编程和调用&#xff0c;创建共享显存空间&#xff0c;实现卷积和矩阵乘法等&#xff0c;通过每个小问题之后还会奖励一个狗狗小视频&#x1f601; 下面是项目的仓库&…

大模型面试宝典:问题全集及权威解答

导读 自ChatGPT开启大模型时代以来&#xff0c;大模型正迎来飞速发展&#xff0c;现在从事大模型开发相关工作可谓是处在时代的风口。那么大模型面试需要哪些技能和技巧呢&#xff0c;本文详细整理了全套的面试问题及答案&#xff0c;希望对大家有所帮助&#xff01; 目录 [x…

脉冲神经网络(SNN)论文阅读(六)-----ECCV-2024 脉冲驱动的SNN目标检测框架:SpikeYOLO

原文链接&#xff1a;CSDN-脉冲神经网络&#xff08;SNN&#xff09;论文阅读&#xff08;六&#xff09;-----ECCV-2024 脉冲驱动的SNN目标检测框架&#xff1a;SpikeYOLO Integer-Valued Training and Spike-Driven Inference Spiking Neural Network for High-performance …

MySQL数据库专栏(二)SQL语句基础操作

目录 数据库操作 创建数据库 查看数据库 选择数据库 删除数据库 数据表操作 数据表数据类型 数据表列约束 数据表索引 创建表 查看表 查看表结构 删除表 数据表的增删改操作 …

自由学习记录

约束的泛型通配符? Java中的泛型 xiaomi和byd都继承了car&#xff0c;但是只是这两个类是car的子类而已&#xff0c;而arraylist<xiaomi> ,arraylist<byd> 两个没有半毛钱继承关系 所以传入的参数整体&#xff0c;是car的list变形&#xff0c;里面的确都能存car…

YOLO11改进 | 卷积模块 | 添加选择性内核SKConv【附完整代码一键运行】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 在标准卷积神经网络 (CNN) 中&#xff0…

单调栈day54|42. 接雨水(高频面试题)、84. 柱状图中最大的矩形、两道题思维导图的汇总与对比

单调栈day54|42. 接雨水&#xff08;高频面试题&#xff09;、84. 柱状图中最大的矩形、两道题思维导图的汇总与对比 42. 接雨水84. 柱状图中最大的矩形两道题思维导图的汇总与对比 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱…

2025,企业管理平台的理想模型V0.1

1.前言 近期出于综合考虑&#xff0c;准备休息一段时间......... 在这段时间里&#xff0c;准备重新梳理下企业管理平台应该具备的能力.并准备使用开源项目来一次组合式组装&#xff0c;最终形成一个初步可行的运行平台。 2.企业管理平台的主要组成 企业管理平台不是独立存…