Python程序设计 内置函数 日志模块

news2024/11/25 20:20:39

logging(日志)

日志记录是程序员工具箱中非常有用的工具。它可以帮助您更好地理解程序的流程,并发现您在开发过程中可能没有想到的场景。

日志为开发人员提供了额外的一组眼睛,这些眼睛不断关注应用程序正在经历的流程。它们可以存储信息,例如访问应用程序的用户或IP。如果发生错误,那么通过告诉您程序在到达发生错误的代码行之前的状态,它们可以提供比堆栈跟踪更多的见解。

通过从正确的位置记录有用的数据,您不仅可以轻松地调试错误,还可以使用数据分析应用程序的性能以规划扩展或查看使用模式以规划营销。

Python提供了一个日志系统作为其标准库的一部分,因此您可以快速将日志记录添加到您的应用程序中。在本文中,您将了解为什么使用此模块是向应用程序添加日志记录以及如何快速入门的最佳方式,您将了解一些可用的高级功能。

Logging模块

Python中的日志记录模块是一个随时可用且功能强大的模块,旨在满足初学者和企业团队的需求。它被大多数第三方Python库使用,因此您可以将日志消息与这些库中的日志消息集成,以为您的应用程序生成同类日志。

将记录添加到Python程序就像这样简单:

import logging

导入日志记录模块后,您可以使用称为“logger”的内容来记录您要查看的消息。默认情况下,有5个标准级别指示事件的严重性。每个都有一个相应的方法,可用于记录该严重级别的事件。按严重程度增加的顺序定义的级别如下:

  • DEBUG
  • 信息 info
  • 警告 warning
  • 错误 error
  • 危急 critical

日志记录模块为您提供了一个默认记录器,使您无需进行太多配置即可开始使用。可以调用每个级别的相应方法,如以下示例所示:

import logging

logging.debug('这里是调试信息')
logging.info('这里是详情信息')
logging.warning('这里是警告信息')
logging.error('这里是错误信息')
logging.critical('这里是危机信息')

上述程序的输出如下所示:

WARNING:root:这里是警告信息
ERROR:root:这里是错误信息
CRITICAL:root:这里是危机信息

输出显示每条消息之前的严重性级别root,即日志记录模块为其默认记录器提供的名称。(记录器将在后面的章节中详细讨论。)此格式显示由冒号(:)分隔的级别,名称和消息,是默认的输出格式,可以配置为包括时间戳,行号和其他内容细节。

请注意,并没有记录debug()info()消息。这是因为,默认情况下,日志记录模块会记录严重性级别为WARNING或更高的邮件。您可以通过将日志记录模块配置为根据需要记录所有级别的事件来更改它。您还可以通过更改配置来定义自己的严重性级别,但通常不建议这样做,因为它可能会导致您可能正在使用的某些第三方库的日志混淆。

基本配置

您可以使用该方法配置日志记录:basicConfig(**kwargs)

一些常用的参数basicConfig()如下:

  • level:根记录器将设置为指定的严重性级别。
  • filename:这指定文件。
  • filemode:如果filename给定,则以此模式打开文件。默认值为a,表示追加。
  • format:这是日志消息的格式。

通过使用该level参数,您可以设置要记录的日志消息级别。这可以通过传递类中可用的一个常量来完成,这将允许记录该级别或更高级别的所有日志记录调用。这是一个例子:

import logging

logging.basicConfig(level=logging.DEBUG)
logging.debug('This will get logged')

 DEBUG:root:This will get logged

DEBUG现在将记录DEBUG级别或更高级别的事件。

同样,对于记录到文件而不是控制台,filename并且filemode可以使用,您可以使用确定消息的格式format。以下示例显示了所有三个的用法:

import logging

logging.basicConfig(filename='app.log', filemode='w', format='%(name)s - %(levelname)s - %(message)s')
logging.warning('This will get logged to a file')

 root - ERROR - This will get logged to a file

该消息将如下所示,但将写入名为app.log而不是控制台的文件。filemode设置为w,这意味着每次basicConfig()调用日志文件都以“写入模式”打开,程序的每次运行都将重写该文件。filemode的默认配置a是append。

您可以使用更多参数进一步自定义根记录器basicConfig(),可在此处找到。

应该注意,basicConfig()只有在之前没有配置根记录器的情况下,调用配置根记录器才有效。基本上,这个函数只能调用一次。

debug()info()warning()error(),和critical()也称basicConfig()自动无参数,如果它以前没有叫。这意味着在第一次调用上述函数之一后,您无法再配置根记录器,因为它们会在basicConfig()内部调用该函数。

默认设置basicConfig()是将记录器设置为以下列格式写入控制台:

ERROR:root:This is an error message

格式化输出

虽然您可以将任何可以表示为字符串的变量作为消息传递给您的日志,但是有一些基本元素已经成为其中的一部分,LogRecord并且可以轻松添加到输出格式中。如果要将进程ID与级别和消息一起记录,可以执行以下操作:

import logging

logging.basicConfig(format='%(process)d-%(levelname)s-%(message)s')
logging.warning('This is a Warning')

18472-WARNING-This is a Warning

format可以使用LogRecord您喜欢的任何排列中的属性字符串。可以在此处找到可用属性的完整列表。

这是另一个可以添加日期和时间信息的示例:

import logging

logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)
logging.info('Admin logged in')

 2018-07-11 20:12:06,288 - Admin logged in

%(asctime)s增加了创造时间LogRecord。可以使用datefmt属性更改格式,该属性使用与datetime模块中的格式化函数相同的格式化语言,例如time.strftime()

import logging

logging.basicConfig(format='%(asctime)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S')
logging.warning('Admin logged out')

 12-Jul-18 20:53:19 - Admin logged out

记录变量数据

在大多数情况下,您可能希望在日志中包含应用程序中的动态信息。您已经看到日志记录方法将字符串作为参数,并且在单独的行中使用可变数据格式化字符串并将其传递给log方法似乎很自然。但实际上,这可以通过使用消息的格式字符串并将变量数据作为参数附加来直接完成。这是一个例子:

import logging

name = 'John'

logging.error('%s raised an error', name)

类和函数

到目前为止,我们已经看到了一个名为默认记录器root,用于通过日志模块,只要其功能被直接称为是这样的:logging.debug()。您可以(并且应该)通过创建Logger类的对象来定义自己的记录器,尤其是在应用程序具有多个模块的情况下。我们来看看模块中的一些类和函数。

日志记录模块中定义的最常用类如下:

  • **Logger:**这是一个类,其对象将直接在应用程序代码中用于调用函数。
  • **LogRecord:**记录器自动创建LogRecord具有与记录事件相关的所有信息的对象,例如记录器的名称,功能,行号,消息等。
  • **Handler:**处理程序将LogRecord控制器或文件发送到所需的输出目标。Handler对于像的子类的碱StreamHandlerFileHandlerSMTPHandlerHTTPHandler,等等。这些子类将日志记录输出发送到相应的目标,如sys.stdout磁盘文件。
  • **Formatter:**您可以通过指定列出输出应包含的属性的字符串格式来指定输出的格式。

其中,我们主要处理Logger类的对象,这些对象使用模块级函数进行实例化logging.getLogger(name)getLogger()使用相同的多次调用name将返回对同一Logger对象的引用,这使我们无法将记录器对象传递到需要它的每个部分。这是一个例子:

import logging

logger = logging.getLogger('example_logger')
logger.warning('This is a warning')

This is a warning

同样,与根记录器不同,无法使用自定义记录器进行配置basicConfig()。您必须使用处理程序和格式化程序对其进行配置:

使用Handler

当您想要配置自己的记录器并在生成日志时将日志发送到多个位置时,处理程序就会出现。处理程序将日志消息发送到已配置的目标(如标准输出流或文件或HTTP)或通过SMTP发送到您的电子邮件。

您创建的记录器可以有多个处理程序,这意味着您可以将其设置为保存到日志文件并通过电子邮件发送。

与记录器一样,您也可以在处理程序中设置严重性级别。如果要为同一记录器设置多个处理程序但希望每个处理程序具有不同的严重性级别,这将非常有用。例如,您可能希望将具有级别WARNING及更高级别的日志记录到控制台,但是具有级别ERROR及更高级别的所有内容也应保存到文件中。这是一个执行该操作的程序:

# logging_example.py

import logging

# Create a custom logger
logger = logging.getLogger(__name__)

# Create handlers
c_handler = logging.StreamHandler()
f_handler = logging.FileHandler('file.log')
c_handler.setLevel(logging.WARNING)
f_handler.setLevel(logging.ERROR)

# Create formatters and add it to handlers
c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
c_handler.setFormatter(c_format)
f_handler.setFormatter(f_format)

# Add handlers to the logger
logger.addHandler(c_handler)
logger.addHandler(f_handler)

logger.warning('This is a warning')
logger.error('This is an error')

 __main__ - WARNING - This is a warning
__main__ - ERROR - This is an error

在这里,logger.warning()创建一个LogRecord包含事件的所有信息并将其传递给它拥有的所有处理程序:c_handlerf_handler

c_handler是一个StreamHandler带有级别WARNING并从中获取信息LogRecord以生成指定格式的输出并将其打印到控制台。f_handler是一个FileHandler 有级别的 ERROR,它忽略LogRecord了它的级别WARNING

logger.error()调用时,c_handler 行为与以前完全相同,并f_handler获得a LogRecord级别ERROR,因此它继续生成输出c_handler,但不是将其打印到控制台,而是以这种格式将其写入指定的文件:

2018-08-03 16:12:21,723 - __main__ - ERROR - This is an error

将与__name__变量对应的记录器的名称记录为__main__,这是Python分配给执行开始的模块的名称。如果此文件由某个其他模块导入,则该__name__变量将对应于其名称*logging_example*。这是它的样子:

# run.py

import logging_example
logging_example - WARNING - This is a warning
logging_example - ERROR - This is an error

保持冷静并阅读日志

记录模块被认为非常灵活。它的设计非常实用,应该适合您的开箱即用。您可以将基本日志记录添加到一个小项目中,或者如果您正在处理一个大项目,则可以创建自己的自定义日志级别,处理程序类等。

如果您还没有在应用程序中使用日志记录,那么现在是开始的好时机。完成后,日志记录肯定会消除开发过程中的大量摩擦,并帮助您找到将应用程序提升到新的水平的机会。

Python 日志模块详解及应用
日志概述

百度百科的日志概述

Windows网络操作系统都设计有各种各样的日志文件,如应用程序日志,安全日志、系统日志、Scheduler服务日志、FTP日志、WWW日志、DNS服务器日志等等,这些根据你的系统开启的服务的不同而有所不同。我们在系统上进行一些操作时,这些日志文件通常会记录下我们操作的一些相关内容,这些内容对系统安全工作人员相当有用。比如说有人对系统进行了IPC探测,系统就会在安全日志里迅速地记下探测者探测时所用的IP、时间、用户名等,用FTP探测后,就会在FTP日志中记下IP、时间、探测所用的用户名等。

我映像中的日志

查看日志是开发人员日常获取信息、排查异常、发现问题的最好途径,日志记录中通常会标记有异常产生的原因、发生时间、具体错误行数等信息,这极大的节省了我们的排查时间,无形中提高了编码效率。

日志分类

我们可以按照输出终端进行分类,也可以按照日志级别进行分类。输出终端指的是将日志在控制台输出显示和将日志存入文件;日志级别指的是 Debug、Info、WARNING、ERROR以及CRITICAL等严重等级进行划分。

Python 的 logging

logging提供了一组便利的日志函数,它们分别是:debug()、 info()、 warning()、 error() 和 critical()。logging函数根据它们用来跟踪的事件的级别或严重程度来命名。标准级别及其适用性描述如下(以严重程度递增排序):

每个级别对应的数字值为 CRITICAL:50,ERROR:40,WARNING:30,INFO:20,DEBUG:10,NOTSET:0。 Python 中日志的默认等级是 WARNING,DEBUG 和 INFO 级别的日志将不会得到显示,在 logging 中更改设置。

日志输出

输出到控制台

使用 logging 在控制台打印日志,这里我们用 Pycharm 编辑器来观察:

import logging


logging.debug('调试信息')
logging.warning('警告信息')
logging.info('详情信息')

从上图运行的结果来看,的确只显示了 WARNING 级别的信息,验证了上面的观点。同时也在控制台输出了日志内容,默认情况下 Python 中使用 logging 模块中的函数打印日志,日志只会在控制台输出,而不会保存到日文件。

有什么办法可以改变默认的日志级别呢?

当然是有的,logging 中提供了 basicConfig 让使用者可以适时调节默认日志级别,我们可以将上面的代码改为:

import logging

logging.basicConfig(level=logging.INFO)
logging.debug('调试信息')
logging.info('详情信息')
logging.warning('警告信息')

在 basicConfig 中设定 level 参数的级别即可。

保存到文件

刚才演示了如何在控制台输出日志内容,并且自由设定日志的级别,那现在就来看看如何将日志保存到文件。依旧是强大的 basicConfig,我们再将上面的代码改为:

import logging

logging.basicConfig(level=logging.DEBUG, filename='coder.log', filemode='a')
logging.debug('调试信息')
logging.info('详情信息')
logging.warning('警告信息')

在配置中填写 filename (指定文件名) 和 filemode (文件写入方式),控制台的日志输出就不见了,那么 coder.log 会生成么?

在 .py 文件的同级目录生成了名为 coder.log 的日志。        

通过简单的代码设置,我们就完成了日志文件在控制台和文件中的输出。

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

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

相关文章

ShardingProxy服务端分库分表

目录 一、为什么要有服务端分库分表? 二、ShardingProxy基础使用 1、部署ShardingProxy 2、配置常用分库分表策略 三、ShardingSphere中的分布式事务机制 1、什么是XA事务? 2、实战理解XA事务 3、如何在ShardingProxy中使用另外两种事务管理器&a…

【不要离开你的舒适圈】:猛兽才希望你落单,亲人总让你回家,4个维度全面构建舒适圈矩阵

单打独斗的英雄时代已经落幕 抱团取暖才是社会寒冬的良策 自然界中,每个物种都占据着自己的领地和生存空间。 生态位的差异决定了它们的生存方式,一旦离开领地,失去群体的庇护,就会沦为野兽的美餐。 人类社会同样存在隐形圈层…

数仓建模:金字塔原理在数仓建模分析中的应用

目录 1 金字塔原理 1.1 金子塔原理基本原理 1.2 金字塔内部结构 2 如何构建金字塔 2.1 金字塔塔尖构建 2.2 金字塔纵向层次构建 2.3 金字塔横向关系构建 2.3.1 归类分组 2.3.2 逻辑递进 2.4 小结 3 金字塔原理应用 3.1 数仓建模 3.1.1 数仓建模分析方法-自上而下…

OBOO鸥柏:液晶拼接大屏搭载节点盒分布式集中管控控制系统新技术

近年来,随着视频监控、会议系统及展示需求的快速增长,KVM分布式输入输出节点控制系统在各大行业中逐渐成为核心技术。OBOO鸥柏的液晶拼接大屏分布式输入输出节点控制系统(WControl),以其创新的技术和卓越的用户体验&am…

在线刷题系统测试报告

一、项目背景 1. 本项目是一个在线刷题系统,灵感来源于力扣和牛客等刷题平台,旨在锻炼自己的代码能力和剖析系统整体结构与各模块之间关系的能力。系统支持用户注册与登录,查看题目列表与题目详情,在线提交代码并提供反馈。 2. 该…

【命令操作】信创终端系统上timedatectl命令详解 _ 统信 _ 麒麟 _ 方德

原文链接:【命令操作】信创终端系统上timedatectl命令详解 | 统信 | 麒麟 | 方德 Hello,大家好啊!今天给大家带来一篇关于如何在信创终端系统上使用timedatectl命令的详细介绍。timedatectl 是Linux系统中非常实用的时间管理工具,…

JMeter模拟并发请求

PostMan不是严格意义上的并发请求工具,实际是串行的,如果需要测试后台接口并发时程序的准确性,建议采用JMeter工具。 案例:JMeter设置20个并发卖票请求,查看后台是否存在超卖的情况 方式一:一共10张票&…

大数据-177 Elasticsearch Query DSL - 聚合分析 指标聚合 桶聚合

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

Excel重新踩坑3:条件格式;基本公式运算符;公式中的单元格引用方式;公式菜单栏其他有用的功能说明;

0、前言:以下内容是学习excel公式的基础内容。 1、需求:将表格特定区域中数值大小大于等于30,小于等于80的单元格,颜色填充为红色,大于80的,颜色填充为黄色。 新建规则之后也可以通过该功能清除规则。 2、基…

【JavaEE初阶】网络编程TCP协议实现回显服务器以及如何处理多个客户端的响应

前言 🌟🌟本期讲解关于TCP/UDP协议的原理理解~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不多说…

【重学 MySQL】六十六、外键约束的使用

【重学 MySQL】六十六、外键约束的使用 外键约束的概念关键字主表和从表/父表和子表外键约束的创建条件外键约束的特点外键约束的创建方式外键约束的删除外键约束的约束等级外键约束的级联操作外键约束的示例外键约束的作用开发场景阿里开发规范 在MySQL中,外键约束…

免费开源的微信开发框架

近年来,随着人工智能技术的快速发展,聊天机器人在各个领域得到了广泛的应用。在社交媒体中,自动回复成为了一个流行的功能,让用户可以方便地与机器人进行互动。gewe框架,一个开源的微信聊天机器人框架,实现…

Android 10.0 Camera2 拍照镜像功能实现

1.前言 在10.0的系统rom定制化开发中,在进行camera2的相关拍照功能开发中,在某些时候会遇到拍照照片 左右镜像的问题,就是照片左半边和右半边是反的,所以就需要在拍照的时候保存图片的时候实现 左右镜像功能,接下来就来分析下拍照保存图片的流程 2.Camera2 拍照镜像功能实…

银行数字化转型导师坚鹏:2025年银行开门红8大思考

2025年银行开门红8大思考:与2024年相比有哪些新的变化与不同? 1. ‌员工:从认清现实到重塑信心‌ 经济下行周期开启,叠加外部不稳定、不确定因素增加,让很多员工不适应、不习惯,甚至产生躺平心态。2025年…

信息学奥赛复赛复习18-CSP-J2022-01解密-二分答案、二分找边界、二分时间复杂度、二分求最小

PDF文档回复:20241017 1 P8814 [CSP-J 2022] 解密 [题目描述] 给定一个正整数 k,有 k 次询问,每次给定三个正整数 ni,ei,di,求两个正整数 pi,qi,使 nipiqi、eidi(pi−1)(qi−1)1 [输入格式] 第一行一个正整数 k,表…

leetcode动态规划(十)-0-1背包理论基础(一维数组)

一维dp数组(滚动数组) leetcode中无纯0-1背包问题,可从卡码网上查看题目46.0-1背包问题 一维数组来源于二维数组,其本质是对一维数组进行压缩了,压缩后需要注意在进行背包容量循环的时候采用后序遍历,而不…

Linux系统基础-进程间通信(3)_模拟实现匿名管道

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Linux系统基础-进程间通信(3)_模拟实现匿名和命名管道 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论&a…

强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断

强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断 目录 强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 EEMD-MPE-KPCA-LSTM(集合经验模态分解-多尺…

无人机电机损耗!

一、电机损耗类型 机械损耗: 主要由于电机的旋转部件(如转子、轴承等)在运转过程中产生的摩擦和磨损。 长时间运行或不当维护可能加剧这种损耗。 电气损耗: 包括电阻损耗、铁芯损耗和杂散损耗等。 这些损耗主要由电流通过电…

Golang | Leetcode Golang题解之第491题非递减子序列

题目: 题解: var (temp []intans [][]int )func findSubsequences(nums []int) [][]int {ans [][]int{}dfs(0, math.MinInt32, nums)return ans }func dfs(cur, last int, nums []int) {if cur len(nums) {if len(temp) > 2 {t : make([]int, len(…