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

如何使用 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 logginglogging.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 RotatingFileHandlerrotating_handler = RotatingFileHandler('app.log', maxBytes=2000, backupCount=5)
logger.addHandler(rotating_handler)

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

结束语

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

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

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

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

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

相关文章

SLMA-雷达点如何转变为range image图像以及range image图像和球坐标系的关系;IROS 2020 REMOVERT动态SLAM论文解析

文章目录 雷达点如何转变到range image图像球体坐标关联 雷达点如何转变到range image图像 使用激光雷达采样得到的点一般包含x y z 坐标以及intensity、time、ring属性。参考如下: namespace velodyne_ros {struct EIGEN_ALIGN16 Point {PCL_ADD_POINT4D;float i…

多维放缩(MDS)与主成分分析(PCA)

文章目录 摘要Abstract1. 多维缩放(MDS)1.1 MDS降维条件1.2 MDS降维步骤 2. 主成分分析(PCA)2.1 最近重构性2.2 最大可分性2.3 PCA维度分析2.4 PCA实战2.5 PCA小结 3. 总结 摘要 多维缩放(MDS)是一种保持样本间距离关系的降维技术…

点餐小程序实战教程16餐厅管理

目录 1 创建数据源2 创建后台功能3 集成腾讯地图4 配置表单信息总结 在我们点餐小程序首页里,一开始会根据用户的位置信息去推荐餐厅,这就要求事先维护好餐厅的信息,本篇我们介绍一下餐厅信息的管理功能。 1 创建数据源 打开我们的数据模型&…

操作系统 | 学习笔记 | 王道 | 3.2 虚拟内存管理

3.2 虚拟内存管理 3.2.1 虚拟内存的基本概念 传统存储管理方式的特征 传统存储管理方式 连续分配 单一连续分配固定分区分配动态分区分配 非连续分配 基本分页存储管理基本分段存储管理基本段页式存储管理 特征: 一次性: 作业必须一次性全部装入内存后…

计算机网络:物理层 —— 数据的传输方式

文章目录 传输方式串行传输串行传输方式特点应用 并行传输特点应用 网卡的串/并转换同步传输同步时钟频率的误差问题特点应用 异步传输特点应用 单向通信特点应用 双向交替通信特点应用 双向同时通信特点应用 传输方式 串行传输 串行传输是一种数据传输方式,指的是…

基于SpringBoot+Uniapp的家庭记账本微信小程序系统设计与实现

项目运行截图 展示效果图 展示效果图 展示效果图 展示效果图 展示效果图 5. 技术框架 5.1 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更…

博诚星光协助企业挑战中国舆论新环境--进入“春秋战国”时代

在互联网时代,中国的舆论环境如同“春秋战国”,信息产生呈现出爆炸式增长。根据统计,国内自媒体的数量已突破2000万,每天生成的信息量高达10亿条。这种庞大的信息洪流,为企业和品牌带来了前所未有的舆论风险。 随着新媒体平台的不断涌现,舆论环境愈发复杂,传统营销方式已难以适…

1007C步行(树上贡献统计)

http://cplusoj.com/d/senior/p/SS241007C 首先可以发现每条边的贡献为 2 min ⁡ ( w x , S − w x ) 2\min(w_x,S-w_x) 2min(wx​,S−wx​), x x x 为下端的点 考虑现在断一条边,连一条边。我们先不考虑断边,只连边。那么这是一个基环树&…

C语言 assert 函数 - C语言零基础入门教程

目录 一.assert 函数简介二.assert 函数使用三.assert 函数用法总结与注意事项四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.assert 函数简介 对于断言,相信大家都不陌生,大多数编程语言也都有断言这一特性。简单地讲…

【查找算法概念】与【线性表的相关查找算法】

1.知识回顾 2.查找算法相关问题汇总 2.1在哪里查找 查找表 2.2通过什么进行查找 关键字的对应 主关键字:比如我们可以通过一个学号来唯一确定一名学生 这里的学号就是一种主关键字。 次关键字:而通过一个名字李华,我们可能会确定不止一名…

【单例模式】

单例模式是指在内存中只会创建且仅创建一次对象的设计模式。 一、实现方式 1. 饿汉式 在类加载的时候就创建实例,无论是否使用,实例都会被创建。优点是实现简单,线程安全。缺点是可能造成资源浪费,而程序可能不一定会使用这个实例…

大数据新视界 --大数据大厂之大数据于基因测序分析的核心应用 - 洞悉生命信息的密钥

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)

目录 重要信息 大会简介 组织单位 大会成员 征稿主题 会议日程 参会方式 重要信息 大会官网:www.icicml.org 大会时间:2024年11月22日-24日 大会地点:中国 深圳 大会简介 第三届图像处理、计算机视觉与机器学…

最强AI绘画大模型Flux可以在SDWebUI 上使用了!超便捷的Flux模型使用教程!AI绘画零基础入门到实战教程

大家好,我是画画的小强 目前最强的AI绘画大模型Flux.1 横空出世有段时间了,模型效果也得到了广泛的认可,但是 Stable Diffusion WebUI 官方迟迟没有跟进,据说是因为要修改很多底层的处理机制,加之ComfyUI如火如荼&…

C++读取大文件三种方法速度比较

目录 测试说明第一种方法:按块读,一次读8kb第二种方法:按行读,一次读一行第三种方法:多线程并行读取完整示例 测试说明 测试文件:100万行,每一行是两个小数,中间用逗号隔开&#xf…

LeetCode讲解篇之377. 组合总和 Ⅳ

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 总和为target的元素组合个数 可以由 总和为target - nums[j]的元素组合个数 转换而来,其中j为nums所有元素的下标 而总和target - nums[j]的元素组合个数 可以由 总和为target - nums[j] - nums[k]的…

谁喝酒 1.3.0 | 这款聚会游戏完全免费,无需注册登录,简洁易用。

适合聚会时玩的游戏APP,完全免费,无需注册登录。 大小:36M 百度网盘:https://pan.baidu.com/s/1nkUi4W3UhMyEsnAiSoOP9g?pwdolxt 夸克网盘:https://pan.quark.cn/s/239397c0c894 移动网盘:https://caiyun…

【英语】4. 熟词僻义

文章目录 前言e.g.总结参考文献 前言 进行英语前后缀的复习 e.g. spell: 咒语 时期want: povertyaddress: 强调,地址,演讲bear: stand, endureblow: blast ,冲击chair: 主席的位置 ,掌管 chair a company fuel: add 燃料&#x…

融乐·Music 1.1.3 | 专为音乐爱好者打造,海量免费音乐资源

融乐Music提供了海量免费音乐资源,满足各种类型的音乐需求。界面简洁,操作方便,支持在线播放和离线下载。 大小:13.6M 百度网盘:https://pan.baidu.com/s/1AVKX747bvteAcO__3o1KCQ?pwdolxt 夸克网盘:http…

【含开题报告+文档+PPT+源码】基于SSM框架的线上交易商城的设计与实现

开题报告 随着互联网的快速发展,电子商务成为了现代化社会中不可或缺的一部分。线上交易平台的兴起,为商家和消费者创造了更多的交易机会和便利。然而,传统的电商平台通常由一家中央机构管理和控制,对商家和消费者的自由度有一定…